diff --git a/.discodeit/Channel/239eef81-4159-4aa5-b4a6-396152b59822.ser b/.discodeit/Channel/239eef81-4159-4aa5-b4a6-396152b59822.ser new file mode 100644 index 00000000..7109b4ac Binary files /dev/null and b/.discodeit/Channel/239eef81-4159-4aa5-b4a6-396152b59822.ser differ diff --git a/.discodeit/Message/fa962b5f-34e6-4e97-ab60-adedccf0ab5d.ser b/.discodeit/Message/fa962b5f-34e6-4e97-ab60-adedccf0ab5d.ser new file mode 100644 index 00000000..3726bc46 Binary files /dev/null and b/.discodeit/Message/fa962b5f-34e6-4e97-ab60-adedccf0ab5d.ser differ diff --git a/.discodeit/ReadStatus/e326ff4b-3ebe-49fa-90ac-a4e69f91c1f4.ser b/.discodeit/ReadStatus/e326ff4b-3ebe-49fa-90ac-a4e69f91c1f4.ser new file mode 100644 index 00000000..1ad0fdce Binary files /dev/null and b/.discodeit/ReadStatus/e326ff4b-3ebe-49fa-90ac-a4e69f91c1f4.ser differ diff --git a/.discodeit/User/d125859c-9301-468d-8f45-b9e1afdc24b9.ser b/.discodeit/User/d125859c-9301-468d-8f45-b9e1afdc24b9.ser new file mode 100644 index 00000000..8614d28c Binary files /dev/null and b/.discodeit/User/d125859c-9301-468d-8f45-b9e1afdc24b9.ser differ diff --git a/.discodeit/UserStatus/d125859c-9301-468d-8f45-b9e1afdc24b9.ser b/.discodeit/UserStatus/d125859c-9301-468d-8f45-b9e1afdc24b9.ser new file mode 100644 index 00000000..131fcede Binary files /dev/null and b/.discodeit/UserStatus/d125859c-9301-468d-8f45-b9e1afdc24b9.ser differ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..8af972cd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/.gitignore b/.gitignore index 30f54e02..c2065bc2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,11 @@ +HELP.md .gradle build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ -### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### Eclipse ### +### STS ### .apt_generated .classpath .factorypath @@ -28,6 +17,15 @@ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + ### NetBeans ### /nbproject/private/ /nbbuild/ @@ -37,10 +35,3 @@ bin/ ### VS Code ### .vscode/ - -### Mac OS ### -.DS_Store - -.idea/ -*.iml -*.xml \ No newline at end of file diff --git a/build.gradle b/build.gradle index 668101a2..1c8b5c58 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,36 @@ plugins { - id 'java' + id 'java' + id 'org.springframework.boot' version '3.4.4' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.sprint.mission' -version = '1.0-SNAPSHOT' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} repositories { - mavenCentral() + mavenCentral() } dependencies { - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } -test { - useJUnitPlatform() -} \ No newline at end of file +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832..9bbc975c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4128b072..37f853b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Wed Apr 02 18:59:18 KST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c7873..faf93008 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # 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 +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 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"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +133,29 @@ 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. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +200,15 @@ if "$cygwin" || "$msys" ; then 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. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +216,12 @@ set -- \ 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. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9..9d21a218 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,94 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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 index 79373e36..2437dfb2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ -rootProject.name = '3-sprint-mission' - +rootProject.name = 'discodeit' diff --git a/src/main/java/com/sprint/JavaApplication.java b/src/main/java/com/sprint/JavaApplication.java deleted file mode 100644 index 0a3c97e4..00000000 --- a/src/main/java/com/sprint/JavaApplication.java +++ /dev/null @@ -1,53 +0,0 @@ -//package com.sprint; -// -//import com.sprint.mission.discodeit.menu.ChannelMenu; -//import com.sprint.mission.discodeit.menu.MessageMenu; -//import com.sprint.mission.discodeit.menu.UserMenu; -//import com.sprint.mission.discodeit.service.ChannelService; -//import com.sprint.mission.discodeit.service.MessageService; -//import com.sprint.mission.discodeit.service.UserService; -//import com.sprint.mission.discodeit.service.file.FileChannelService; -//import com.sprint.mission.discodeit.service.file.FileMessageService; -//import com.sprint.mission.discodeit.service.file.FileUserService; -//import java.util.Scanner; -// -//public class JavaApplication { -//스프린트 미션1 코드 -// private static final Scanner sc = new Scanner(System.in); -// -// public static void main(String[] args) { -// ChannelService channelService = new FileChannelService(); -// MessageService messageService = new FileMessageService(); -// UserService userService = new FileUserService(); -// -// UserMenu userMenu = new UserMenu(sc, userService); -// ChannelMenu channelMenu = new ChannelMenu(sc, channelService); -// MessageMenu messageMenu = new MessageMenu(sc, messageService); -// -// userMenu.loginUser(); -// -// System.out.println("모든 채널 정보를 출력합니다."); -// channelService.outputAllChannelInfo(); -// System.out.println("들어가실 채널 번호를 선택해 주세요."); -// int channelNumber = Integer.parseInt(sc.nextLine()); -// channelService.selectChannel(channelNumber); -// -// while (true) { -// System.out.println("원하는 기능을 입력 해 주세요."); -// System.out.println("1. 내 정보\t2. 채널 정보\t3. 메시지\t4. 로그아웃"); -// int choice = Integer.parseInt(sc.nextLine()); -// -// switch (choice) { -// case 1 -> userMenu.run(); -// case 2 -> channelMenu.run(); -// case 3 -> messageMenu.run(); -// case 4 -> { -// System.out.println("Discodeit을 종료합니다. 감사합니다."); -// sc.close(); -// return; -// } -// default -> System.out.println("올바른 번호를 입력해 주세요."); -// } -// } -// } -//} \ No newline at end of file diff --git a/src/main/java/com/sprint/JavaApplication2.java b/src/main/java/com/sprint/JavaApplication2.java deleted file mode 100644 index 408df49b..00000000 --- a/src/main/java/com/sprint/JavaApplication2.java +++ /dev/null @@ -1,67 +0,0 @@ -//package com.sprint; -// -//import com.sprint.mission.discodeit.entity.Channel; -//import com.sprint.mission.discodeit.menu.ChannelMenu; -//import com.sprint.mission.discodeit.menu.MessageMenu; -//import com.sprint.mission.discodeit.menu.UserMenu; -//import com.sprint.mission.discodeit.repository.DefaultChannelFactory; -//import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; -//import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; -//import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; -//import com.sprint.mission.discodeit.service.ChannelService; -//import com.sprint.mission.discodeit.service.MessageService; -//import com.sprint.mission.discodeit.service.UserService; -//import com.sprint.mission.discodeit.service.basic.BasicChannelService; -//import com.sprint.mission.discodeit.service.basic.BasicMessageService; -//import com.sprint.mission.discodeit.service.basic.BasicUserService; -//import java.util.Scanner; -// -//public class JavaApplication2 { -// -// private static final Scanner sc = new Scanner(System.in); -// -// //JCF 기반 테스트 -// public static void main(String[] args) { -// JCFUserRepository jcfUserRepo = new JCFUserRepository(); -// JCFChannelRepository jcfChannelRepo = new JCFChannelRepository(); -// JCFMessageRepository jcfMessageRepo = new JCFMessageRepository(); -// DefaultChannelFactory.getChannel() -// .forEach(jcfChannelRepo::saveChannel); -// -// UserService userServiceJCF = new BasicUserService(jcfUserRepo); -// ChannelService channelServiceJCF = new BasicChannelService(jcfChannelRepo); -// MessageService messageServiceJCF = new BasicMessageService(jcfMessageRepo); -// -// UserMenu userMenu = new UserMenu(sc, userServiceJCF); -// -// MessageMenu messageMenu = new MessageMenu(sc, messageServiceJCF); -// -// userMenu.loginUser(); -// -// System.out.println("모든 채널 정보를 출력합니다."); -// channelServiceJCF.outputAllChannelInfo(); -// System.out.println("들어가실 채널 번호를 선택해 주세요."); -// int channelNumber = Integer.parseInt(sc.nextLine()); -// Channel selectedChannel = channelServiceJCF.getChannelByNumber(channelNumber); -// channelServiceJCF.selectChannel(channelNumber); -// -// ChannelMenu channelMenu = new ChannelMenu(sc, channelServiceJCF, selectedChannel); -// while (true) { -// System.out.println("원하는 기능을 입력 해 주세요."); -// System.out.println("1. 내 정보\t2. 채널 정보\t3. 메시지\t4. 로그아웃"); -// int choice = Integer.parseInt(sc.nextLine()); -// -// switch (choice) { -// case 1 -> userMenu.run(); -// case 2 -> channelMenu.run(); -// case 3 -> messageMenu.run(); -// case 4 -> { -// System.out.println("Discodeit을 종료합니다. 감사합니다."); -// sc.close(); -// return; -// } -// default -> System.out.println("올바른 번호를 입력해 주세요."); -// } -// } -// } -//} \ No newline at end of file diff --git a/src/main/java/com/sprint/JavaApplication3.java b/src/main/java/com/sprint/JavaApplication3.java deleted file mode 100644 index dec256d8..00000000 --- a/src/main/java/com/sprint/JavaApplication3.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sprint; - -import com.sprint.mission.discodeit.menu.ChannelMenu; -import com.sprint.mission.discodeit.menu.MessageMenu; -import com.sprint.mission.discodeit.menu.UserMenu; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; -import java.util.Scanner; - -public class JavaApplication3 { - - private static final Scanner sc = new Scanner(System.in); - - public static void main(String[] args) { - FileUserRepository fileUserRepo = new FileUserRepository(); - FileChannelRepository fileChannelRepo = new FileChannelRepository(); - FileMessageRepository fileMessageRepo = new FileMessageRepository(); - - UserService userService = new BasicUserService(fileUserRepo); - ChannelService channelService = new BasicChannelService(fileChannelRepo); - MessageService messageService = new BasicMessageService(fileMessageRepo); - - UserMenu userMenu = new UserMenu(sc, userService); - ChannelMenu channelMenu = new ChannelMenu(sc, channelService); - MessageMenu messageMenu = new MessageMenu(sc, messageService); - - userMenu.loginUser(); - - while (true) { - System.out.println("\n원하는 기능을 입력해 주세요."); - System.out.println("1. 내 정보\t2. 채널 정보\t3. 메시지\t4. 로그아웃"); - int choice = Integer.parseInt(sc.nextLine()); - - switch (choice) { - case 1 -> userMenu.run(); - case 2 -> channelMenu.run(); - case 3 -> messageMenu.run(); - case 4 -> { - System.out.println("Discodeit을 종료합니다. 감사합니다."); - sc.close(); - return; - } - default -> System.out.println("올바른 번호를 입력해 주세요."); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java new file mode 100644 index 00000000..4a7d2e43 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -0,0 +1,200 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginReponse; +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginRequest; +import com.sprint.mission.discodeit.dto.Channel.ChannelFindRequest; +import com.sprint.mission.discodeit.dto.Channel.ChannelResponse; +import com.sprint.mission.discodeit.dto.Channel.ChannelUpdateRequest; +import com.sprint.mission.discodeit.dto.Channel.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.Channel.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.Message.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.User.UserCreateRequest; +import com.sprint.mission.discodeit.dto.User.UserFindRequest; +import com.sprint.mission.discodeit.dto.User.UserResponse; +import com.sprint.mission.discodeit.dto.User.UserUpdateRequest; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.service.AuthService; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import java.util.List; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class DiscodeitApplication { + + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); + + UserService userService = context.getBean(UserService.class); + ChannelService channelService = context.getBean(ChannelService.class); + MessageService messageService = context.getBean(MessageService.class); + AuthService authService = context.getBean(AuthService.class); + + System.out.println("====== 유저 생성 테스트 ======"); + + UserCreateRequest user1CreateRequest = UserCreateRequest.builder() + .username("username1") + .email("user1@example.com") + .password("password1") + .content(false) + .profileImage(null) + .profileContentType(null) + .build(); + + UserCreateRequest user2CreateRequest = UserCreateRequest.builder() + .username("user2") + .email("user2@example.com") + .password("password2") + .content(false) + .profileImage(null) + .profileContentType(null) + .build(); + + User user1 = userService.create(user1CreateRequest); + User user2 = userService.create(user2CreateRequest); + System.out.println("생성된 유저 1 ID: " + user1.getId()); + System.out.println("생성된 유저 2 ID: " + user2.getId()); + + System.out.println("\n====== 유저 로그인 테스트 ======"); + AuthLoginRequest loginRequest = AuthLoginRequest.builder() + .userName(user1CreateRequest.username()) + .password(user1CreateRequest.password()) + .build(); + + AuthLoginReponse authLoginReponse = authService.login(loginRequest); + System.out.println(authLoginReponse); + System.out.println("\n====== 유저 단일 조회 테스트 ======"); + + UserResponse foundUser = userService.find(UserFindRequest.builder() + .userId(user1.getId()) + .build()); + System.out.println(foundUser); + + System.out.println("\n====== 유저 전체 조회 테스트 ======"); + + List allUsers = userService.findAll(); + for (UserResponse user : allUsers) { + System.out.println(user); + } + + System.out.println("\n====== 유저 수정 테스트 ======"); + + UserUpdateRequest updateRequest = UserUpdateRequest.builder() + .userId(user2.getId()) + .newUsername("new_user2") + .newEmail("new_user2@example.com") + .newPassword("new_password2") + .hasProfileImage(false) + .newProfileImage(null) + .newProfileContentType(null) + .build(); + + User updatedUser = userService.update(updateRequest); + + System.out.println("수정된 유저:"); + System.out.println(updatedUser); + + System.out.println("\n====== 유저1 삭제 후 전체 조회 테스트 ======"); + userService.delete(user1.getId()); + + List afterDeleteUsers = userService.findAll(); + for (UserResponse user : afterDeleteUsers) { + System.out.println(user); + } + + System.out.println("\n====== 유저 테스트 완료 ======"); + + System.out.println("\n====== 채널 테스트 시작 ======"); + + PublicChannelCreateRequest publicChannelCreateRequest = PublicChannelCreateRequest.builder() + .channelName("공지사항") + .description("모두가 볼 수 있는 공지") + .build(); + + Channel publicChannel = channelService.create(publicChannelCreateRequest); + + PrivateChannelCreateRequest privateChannelCreateRequest = PrivateChannelCreateRequest.builder() + .participantsIds(List.of(user1.getId())) + .build(); + + // 3. PRIVATE 채널 생성 (user1만 참여) + Channel privateChannel = channelService.create(privateChannelCreateRequest); + + System.out.println("\n=== PUBLIC 채널 조회 테스트 ==="); + ChannelResponse publicResponse = channelService.find( + ChannelFindRequest.builder() + .id(publicChannel.getId()) + .build() + ); + System.out.println(publicResponse); + + // 5. PRIVATE 채널 조회 테스트 + System.out.println("\n=== PRIVATE 채널 조회 테스트 ==="); + ChannelResponse privateResponse = channelService.find( + ChannelFindRequest.builder() + .id(privateChannel.getId()) + .build() + ); + System.out.println(privateResponse); + + // 4. user1이 볼 수 있는 채널 확인 + System.out.println("\n=== user1이 볼 수 있는 채널 ==="); + List user1Channels = channelService.findAllByUserId(user1.getId()); + user1Channels.forEach(System.out::println); + + ReadStatusRepository readStatusRepository = context.getBean(ReadStatusRepository.class); + + System.out.println("\n=== private 채널 참여자 ReadStatus ==="); + readStatusRepository.findAllByChannelId(privateChannel.getId()).forEach(System.out::println); + + // 5. user2가 볼 수 있는 채널 확인 + System.out.println("\n=== user2가 볼 수 있는 채널 ==="); + List user2Channels = channelService.findAllByUserId(user2.getId()); + user2Channels.forEach(System.out::println); + + System.out.println("\n=== public 채널 업데이트 테스트 ==="); + ChannelUpdateRequest channelUpdateRequest = ChannelUpdateRequest.builder() + .id(publicChannel.getId()) + .type(ChannelType.PUBLIC) + .name("새로운 공지") + .description("업데이트햇음") + .build(); + channelService.update(channelUpdateRequest); + publicResponse = channelService.find(ChannelFindRequest.builder() + .id(publicChannel.getId()) + .build()); + System.out.println(publicResponse); + + System.out.println("\n=== public 채널 삭제 테스트 ==="); + channelService.delete(publicChannel.getId()); + + System.out.println("\n=== user2가 볼 수 있는 채널 ==="); + user2Channels = channelService.findAllByUserId(user2.getId()); + user2Channels.forEach(System.out::println); + + // 6. 메시지 테스트 시작 + System.out.println("\n=== 메시지 생성 테스트 ==="); + + MessageCreateRequest messageCreateRequest = MessageCreateRequest.builder() + .content("첫 번째 테스트 메시지입니다.") + .channelId(privateChannel.getId()) + .authorId(user2.getId()) + .build(); + + Message createdMessage = messageService.create(messageCreateRequest, null); + System.out.println("메시지 생성됨: ID = " + createdMessage.getId()); + + System.out.println("\n=== 메시지 조회 테스트 ==="); + Message foundMessage = messageService.find(createdMessage.getId()); + + System.out.println("조회된 메시지 내용: " + foundMessage.getContent()); + System.out.println("첨부파일 ID들: " + foundMessage.getAttachmentIds()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginReponse.java b/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginReponse.java new file mode 100644 index 00000000..865ac703 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginReponse.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.AuthLogin; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record AuthLoginReponse( + UUID id, + String userName, + String email +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginRequest.java new file mode 100644 index 00000000..d94fc296 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/AuthLogin/AuthLoginRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.AuthLogin; + +import lombok.Builder; + +public record AuthLoginRequest( + String userName, + String password +) { + @Builder + public AuthLoginRequest { + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/BinaryContent/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/BinaryContent/BinaryContentCreateRequest.java new file mode 100644 index 00000000..abb26e61 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/BinaryContent/BinaryContentCreateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.BinaryContent; + +public record BinaryContentCreateRequest( + String fileName, + String contentType, + byte[] bytes +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelFindRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelFindRequest.java new file mode 100644 index 00000000..35e112c1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelFindRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.Channel; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record ChannelFindRequest( + UUID id +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelResponse.java new file mode 100644 index 00000000..7e0e0e0d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelResponse.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.dto.Channel; + +import com.sprint.mission.discodeit.entity.ChannelType; +import java.time.Instant; +import java.util.List; +import java.util.UUID; +import lombok.Builder; + +@Builder +public record ChannelResponse( + UUID id, + ChannelType type, + String name, + String description, + Instant lastMessageAt, + List participantIds +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelUpdateRequest.java new file mode 100644 index 00000000..b8b66ca4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Channel/ChannelUpdateRequest.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.dto.Channel; + +import com.sprint.mission.discodeit.entity.ChannelType; +import java.util.UUID; +import lombok.Builder; + +@Builder +public record ChannelUpdateRequest( + UUID id, + ChannelType type, + String name, + String description + +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Channel/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Channel/PrivateChannelCreateRequest.java new file mode 100644 index 00000000..b329e2f2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Channel/PrivateChannelCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.Channel; + +import java.util.List; +import java.util.UUID; +import lombok.Builder; + +@Builder +public record PrivateChannelCreateRequest( + List participantsIds +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Channel/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Channel/PublicChannelCreateRequest.java new file mode 100644 index 00000000..181a1b05 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Channel/PublicChannelCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.Channel; + +import lombok.Builder; + +@Builder +public record PublicChannelCreateRequest( + String channelName, + String description + +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageCreateRequest.java new file mode 100644 index 00000000..4d191bef --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.Message; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record MessageCreateRequest( + String content, + UUID channelId, + UUID authorId +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageUpdateRequest.java new file mode 100644 index 00000000..525b316a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Message/MessageUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.Message; + +import java.util.UUID; + +public record MessageUpdateRequest( + UUID id, + String content +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusCreateRequest.java new file mode 100644 index 00000000..5f275480 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.ReadStatus; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusCreateRequest( + UUID userId, + UUID channelId, + Instant recentReadAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusUpdateRequest.java new file mode 100644 index 00000000..cd6278f7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/ReadStatus/ReadStatusUpdateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.ReadStatus; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusUpdateRequest( + UUID id, + Instant newReadAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/User/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/User/UserCreateRequest.java new file mode 100644 index 00000000..182faf42 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/User/UserCreateRequest.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.dto.User; + +import lombok.Builder; + +public record UserCreateRequest( + String username, + String email, + String password, + boolean content, + byte[] profileImage, + String profileContentType +) { + @Builder + public UserCreateRequest { + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/User/UserFindRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/User/UserFindRequest.java new file mode 100644 index 00000000..e1e40597 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/User/UserFindRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.User; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record UserFindRequest( + UUID userId +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/User/UserResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/User/UserResponse.java new file mode 100644 index 00000000..6dbc973c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/User/UserResponse.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.dto.User; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record UserResponse( + UUID id, + String username, + String email, + boolean isOnline, + boolean hasProfileImage +) { +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/dto/User/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/User/UserUpdateRequest.java new file mode 100644 index 00000000..ea6a670d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/User/UserUpdateRequest.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.dto.User; + +import java.util.UUID; +import lombok.Builder; + +@Builder +public record UserUpdateRequest( + UUID userId, + String newUsername, + String newEmail, + String newPassword, + boolean hasProfileImage, + byte[] newProfileImage, + String newProfileContentType +) { +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusCreateRequest.java new file mode 100644 index 00000000..a7810ef7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.UserStatus; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusCreateRequest( + + UUID userId, + Instant recentStatusAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusUpdateRequest.java new file mode 100644 index 00000000..6886f3d2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/UserStatus/UserStatusUpdateRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.UserStatus; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusUpdateRequest( + UUID id, + Instant StatusAt +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java new file mode 100644 index 00000000..55427d06 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,40 @@ +package com.sprint.mission.discodeit.entity; + +import java.io.Serializable; +import java.time.Instant; +import java.util.Arrays; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class BinaryContent implements Serializable { + private static final long serialVersionUID = 6424554869951126230L; + private UUID id; + private Instant cratedAt; + + private String fileName; + private String contentType; + private byte[] content; + + public BinaryContent(String fileName, String contentType, byte[] content) { + this.id = UUID.randomUUID(); + this.fileName = fileName; + + this.cratedAt = Instant.now(); + this.content = content; + this.contentType = contentType; + } + + @Override + public String toString() { + return "BinaryContent{" + + "id=" + id + + ", cratedAt=" + cratedAt + + ", content=" + Arrays.toString(content) + + ", contentType='" + contentType + '\'' + + '}'; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index a9316bb8..de75dd2e 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,83 +1,53 @@ package com.sprint.mission.discodeit.entity; import java.io.Serializable; +import java.time.Instant; import java.util.UUID; +import lombok.Getter; +@Getter public class Channel implements Serializable { - private static final long serialVersionUID = -8345660952343662023L; - private static int counter = 1; - - private int number; - private String channelName; + private static final long serialVersionUID = -7977352704315297579L; private UUID id; - private long createdAt; - private long updateAt; + private Instant createdAt; + private Instant updatedAt; + private ChannelType type; + private String name; + private String description; - public Channel(String channelName) { - this.number = counter++; - this.channelName = channelName; + public Channel(ChannelType type, String name, String description) { this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updateAt = System.currentTimeMillis(); - } - - public void updateChannel(String channelName) { - this.channelName = channelName; - this.updateAt = System.currentTimeMillis(); - } - - public String getChannelName() { - return channelName; - } - - public UUID getId() { - return id; - } - - public int getChannelNumber() { - return number; - } - - public Long getCreatedAt() { - return createdAt; - } - - public Long getUpdateAt() { - return updateAt; - } - - public static void setCounter(int newCounter) { - counter = newCounter; - } - - public void setNumber(int number) { - this.number = number; - } - - public void setChannelName(String channelName) { - this.channelName = channelName; - } - - public void setId(UUID id) { - this.id = id; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public void setUpdateAt(long updateAt) { - this.updateAt = updateAt; + this.createdAt = Instant.now(); + this.type = type; + this.name = name; + this.description = description; } @Override public String toString() { return "Channel{" + - "number=" + number + - ", channelName='" + channelName + '\'' + - ", id=" + id + + "id=" + id + ", createdAt=" + createdAt + - ", updateAt=" + updateAt + + ", updatedAt=" + updatedAt + + ", type=" + type + + ", name='" + name + '\'' + + ", description='" + description + '\'' + '}'; } + + public void update(String newName, String newDescription) { + boolean anyValueUpdated = false; + if (newName != null && !newName.equals(this.name)) { + this.name = newName; + anyValueUpdated = true; + } + if (newDescription != null && !newDescription.equals(this.description)) { + this.description = newDescription; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java new file mode 100644 index 00000000..9a2ff3f0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.entity; + +public enum ChannelType { + PUBLIC, + PRIVATE, +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index edb99cb8..3cbda61e 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,84 +1,58 @@ package com.sprint.mission.discodeit.entity; import java.io.Serializable; +import java.time.Instant; +import java.util.List; import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class Message implements Serializable { - private static final long serialVersionUID = -953021662940755622L; - private static int counter = 1; + private static final long serialVersionUID = 85772952824868174L; - private int number; private UUID id; - private long createdAt; - private long updateAt; - private String message; + private Instant createdAt; + private Instant updatedAt; - public Message(String message) { - this.number = counter++; - this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updateAt = System.currentTimeMillis(); - this.message = message; - } - - public void updateMessage(String message) { - this.number = counter++; - this.message = message; - this.updateAt = System.currentTimeMillis(); - } - - public UUID getId() { - return id; - } - - public long getCreatedAt() { - return createdAt; - } - - public long getUpdateAt() { - return updateAt; - } - - public String getMessage() { - return message; - } - - public int getNumber() { - return number; - } - - public static void setCounter(int counter) { - Message.counter = counter; - } + private String content; - public void setNumber(int number) { - this.number = number; - } + private UUID channelId; + private UUID authorId; + private List attachmentIds; - public void setId(UUID id) { - this.id = id; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public void setUpdateAt(long updateAt) { - this.updateAt = updateAt; - } + public Message(String content, UUID channelId, UUID authorId, List attachmentIds) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); - public void setMessage(String message) { - this.message = message; + this.content = content; + this.channelId = channelId; + this.authorId = authorId; + this.attachmentIds = attachmentIds; } @Override public String toString() { return "Message{" + - "number=" + number + - ", id=" + id + + "id=" + id + ", createdAt=" + createdAt + - ", updateAt=" + updateAt + - ", message='" + message + '\'' + + ", updatedAt=" + updatedAt + + ", content='" + content + '\'' + + ", channelId=" + channelId + + ", authorId=" + authorId + '}'; } -} \ No newline at end of file + + public void update(String newContent) { + boolean anyValueUpdated = false; + if (newContent != null && !newContent.equals(this.content)) { + this.content = newContent; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java new file mode 100644 index 00000000..9270ad22 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,52 @@ +package com.sprint.mission.discodeit.entity; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; +import lombok.Getter; + +@Getter +public class ReadStatus implements Serializable { + private static final long serialVersionUID = 8045686006427993964L; + private Instant cratedAt; + private Instant updatedAt; + + private UUID id; + private UUID userId; + private UUID channelId; + + private Instant lastReadAt; + + + public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) { + this.cratedAt = Instant.now(); + this.id = UUID.randomUUID(); + this.userId = userId; + this.channelId = channelId; + this.lastReadAt = lastReadAt; + } + + @Override + public String toString() { + return "ReadStatus{" + + "cratedAt=" + cratedAt + + ", updatedAt=" + updatedAt + + ", id=" + id + + ", id=" + userId + + ", channelId=" + channelId + + ", lastReadAt=" + lastReadAt + + '}'; + } + + public void update(Instant newLastReadAt) { + boolean anyValueUpdated = false; + if (newLastReadAt != null && !newLastReadAt.equals(this.lastReadAt)) { + this.lastReadAt = newLastReadAt; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 38c759b2..3c566d19 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,83 +1,71 @@ package com.sprint.mission.discodeit.entity; import java.io.Serializable; +import java.time.Instant; import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +@Setter +@Getter public class User implements Serializable { - private static final long serialVersionUID = 2047441161413796353L; + private static final long serialVersionUID = -7340272091383763402L; - private static int counter = 1; - private int number; - private String username; private UUID id; - private long createdAt; - private long updatedAt; - - public User(String name) { - this.number = counter++; - this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); - this.username = name; - } - - public void updateUserName(String username) { - this.username = username; - this.updatedAt = System.currentTimeMillis(); - } - - public String getUsername() { - return username; - } + private Instant createdAt; + private Instant updatedAt; + private String username; + private String email; + private String password; + private boolean hasProfileImage; + private UUID profileId; - public void setNumber(int number) { - this.number = number; - } - public void setUsername(String username) { + public User(String username, String email, String password, boolean content) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); this.username = username; + this.email = email; + this.password = password; + this.hasProfileImage = content; + this.profileId = null; } - public void setId(UUID id) { - this.id = id; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public void setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - } - - public UUID getId() { - return id; - } - - public long getCreatedAt() { - return createdAt; - } - - public long getUpdatedAt() { - return updatedAt; - } - - public int getNumber() { - return number; - } - - public static void setCounter(int newCounter) { - counter = newCounter; + public void setProfileId(UUID profileId) { + this.profileId = profileId; + this.hasProfileImage = true; } @Override public String toString() { return "User{" + - "number=" + number + - ", username='" + username + '\'' + - ", id=" + id + + "id=" + id + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + + ", username='" + username + '\'' + + ", email='" + email + '\'' + + ", password='" + password + '\'' + '}'; } -} \ No newline at end of file + + public void update(String newUsername, String newEmail, String newPassword) { + boolean anyValueUpdated = false; + if (newUsername != null && !newUsername.equals(this.username)) { + this.username = newUsername; + anyValueUpdated = true; + } + if (newEmail != null && !newEmail.equals(this.email)) { + this.email = newEmail; + anyValueUpdated = true; + } + if (newPassword != null && !newPassword.equals(this.password)) { + this.password = newPassword; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java new file mode 100644 index 00000000..57299ca1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,49 @@ +package com.sprint.mission.discodeit.entity; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; +import lombok.Getter; + +@Getter +public class UserStatus implements Serializable { + private static final long serialVersionUID = -7488891392699063722L; + private Instant cratedAt; + private Instant updatedAt; + private Instant StatusAt; + + private UUID id; + private UUID userId; + + public UserStatus(Instant recentStatusAt, UUID userId) { + this.cratedAt = Instant.now(); + this.StatusAt = recentStatusAt; + this.updatedAt = Instant.now(); + this.id = UUID.randomUUID(); + this.userId = userId; + } + + public void update(Instant recentStatusAt) { + boolean anyValueUpdated = false; + + if (recentStatusAt != null && !recentStatusAt.equals(this.StatusAt)) { + this.StatusAt = recentStatusAt; + anyValueUpdated = true; + } + + if (anyValueUpdated) { + this.updatedAt = Instant.now(); + } + } + + @Override + public String toString() { + return "UserStatus{" + + "cratedAt=" + cratedAt + + ", updatedAt=" + updatedAt + + ", id=" + id + + ", id=" + userId + + '}'; + } + +} diff --git a/src/main/java/com/sprint/mission/discodeit/menu/ChannelMenu.java b/src/main/java/com/sprint/mission/discodeit/menu/ChannelMenu.java deleted file mode 100644 index 978fa083..00000000 --- a/src/main/java/com/sprint/mission/discodeit/menu/ChannelMenu.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.sprint.mission.discodeit.menu; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.service.ChannelService; -import java.util.Scanner; - -public class ChannelMenu { - private final Scanner sc; - private final ChannelService channelService; - private Channel currentChannel; - - public ChannelMenu(Scanner scanner, ChannelService channelService) { - this.sc = scanner; - this.channelService = channelService; - } - - public void run() { - - System.out.println("모든 채널 정보를 출력합니다."); - channelService.outputAllChannelInfo(); - System.out.println("들어가실 채널 번호를 선택해 주세요."); - int channelNumber = Integer.parseInt(sc.nextLine()); - currentChannel = channelService.getChannelByNumber(channelNumber); - if (currentChannel == null) { - System.out.println("유효하지 않은 채널 번호입니다."); - return; - } - - while (true) { - System.out.println("1. 채널 생성\t2. 현재 채널 정보 출력\t3. 모든 채널 정보 출력\t4. 채널 이름 수정\t5. 채널 삭제\t6. 채널 변경\t7. 이전 메뉴"); - int n = Integer.parseInt(sc.nextLine()); - - switch (n) { - case 1 -> { - System.out.println("새로 추가하실 채널 이름을 입력해 주세요."); - String newChannelName = sc.nextLine(); - channelService.createNewChannel(newChannelName); - } - case 2 -> channelService.outputOneChannelInfo(currentChannel); - case 3 -> channelService.outputAllChannelInfo(); - case 4 -> { - System.out.println("현재 접속중인 채널은 " + currentChannel.getChannelName() + "입니다. 새로운 채널 이름을 입력해 주세요."); - String updateChannelName = sc.nextLine(); - channelService.updateChannelName(currentChannel, updateChannelName); - } - case 5 -> { - System.out.println(currentChannel.getChannelName() + " 채널을 삭제합니다."); - channelService.deleteChannelName(currentChannel); - System.out.println("정상적으로 채널이 삭제됐습니다. 변경하실 채널 번호를 입력해주세요."); - channelService.outputAllChannelInfo(); - int newChannelNumber = Integer.parseInt(sc.nextLine()); - currentChannel = channelService.getChannelByNumber(newChannelNumber); - if (currentChannel == null) { - System.out.println("유효하지 않은 채널 번호입니다."); - } - } - case 6 -> { - System.out.println("변경하실 채널 번호를 입력해주세요."); - channelService.outputAllChannelInfo(); - int newChannelNumber = Integer.parseInt(sc.nextLine()); - currentChannel = channelService.getChannelByNumber(newChannelNumber); - if (currentChannel == null) { - System.out.println("유효하지 않은 채널 번호입니다."); - } - } - case 7 -> { - return; - } - default -> System.out.println("올바른 번호를 입력해 주세요."); - } - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/menu/MessageMenu.java b/src/main/java/com/sprint/mission/discodeit/menu/MessageMenu.java deleted file mode 100644 index 3e6e535b..00000000 --- a/src/main/java/com/sprint/mission/discodeit/menu/MessageMenu.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.sprint.mission.discodeit.menu; - - -import com.sprint.mission.discodeit.service.MessageService; -import java.util.Scanner; - -public class MessageMenu { - private final Scanner sc; - private final MessageService messageService; - - public MessageMenu(Scanner sc, MessageService messageService) { - this.sc = sc; - this.messageService = messageService; - } - - public void run() { - while (true) { - System.out.println("1. 메시지 작성\t2. 작성한 메시지 출력\t3. 메시지 수정\t4. 메시지 삭제\t5. 이전 메뉴로 돌아가기"); - int n = Integer.parseInt(sc.nextLine()); - - switch (n) { - case 1 -> { - System.out.println("작성하실 메시지를 입력해 주세요."); - String messageText = sc.nextLine(); - messageService.inputMessage(messageText); - System.out.println("메시지 작성 완료!"); - } - case 2 -> messageService.outputUserMessage(); - case 3 -> { - System.out.println("수정할 메시지의 번호를 입력해 주세요."); - messageService.outputUserMessage(); - int messageNumber = Integer.parseInt(sc.nextLine()); - System.out.println("수정할 메시지를 입력해 주세요."); - String newMessage = sc.nextLine(); - messageService.updateUserMessage(messageNumber, newMessage); - } - case 4 -> { - System.out.println("삭제할 메시지의 번호를 입력해 주세요."); - messageService.outputUserMessage(); - int deleteMessageNumber = Integer.parseInt(sc.nextLine()); - messageService.deleteUserMessage(deleteMessageNumber); - System.out.println("삭제가 완료됐습니다."); - } - case 5 -> { - return; - } - default -> System.out.println("올바른 번호를 입력해 주세요."); - } - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/menu/UserMenu.java b/src/main/java/com/sprint/mission/discodeit/menu/UserMenu.java deleted file mode 100644 index f96380e5..00000000 --- a/src/main/java/com/sprint/mission/discodeit/menu/UserMenu.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.sprint.mission.discodeit.menu; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.UserService; -import java.util.Scanner; - -public class UserMenu { - private final Scanner sc; - private final UserService userService; - private User loginUser; - - public UserMenu(Scanner scanner, UserService userService) { - this.sc = scanner; - this.userService = userService; - } - - public void loginUser() { - userService.registerUser(); - - System.out.println("로그인 하실 프로필 번호를 입력해 주세요."); - userService.outputAllUsersInfo(); - int loginNumber = Integer.parseInt(sc.nextLine()); - userService.login(loginNumber); - loginUser = userService.changeUser(loginNumber); - - System.out.println(loginUser.getUsername() + "님, 반갑습니다."); - } - - public void run() { - if (loginUser == null) { - System.out.println("사용자가 로그인되지 않았습니다."); - return; - } - while (true) { - System.out.println( - "1. 새로운 프로필 추가\t2. 모든 프로필 정보 출력\t3. 프로필 정보 출력\t4. 프로필 이름 수정\t5. 프로필 정보 삭제\t6. 프로필 변경\t7. 이전 메뉴"); - int n = Integer.parseInt(sc.nextLine()); - - switch (n) { - case 1 -> { - System.out.println("새로운 프로필 이름을 입력해 주세요."); - String newUser = sc.nextLine(); - userService.createNewUserNames(loginUser.getUsername(), newUser); - } - case 2 -> userService.outputAllUsersInfo(); - case 3 -> userService.outputOneUserInfo(loginUser.getId()); - case 4 -> { - System.out.println("현재 사용자 이름: " + loginUser.getUsername() + ". 변경할 이름을 입력해 주세요."); - String updateUserName = sc.nextLine(); - userService.updateUserName(loginUser, updateUserName); - } - case 5 -> { - userService.outputAllUsersInfo(); - System.out.println("삭제할 사용자의 번호를 입력해 주세요."); - int num = Integer.parseInt(sc.nextLine()); - System.out.println(loginUser.getUsername() + " 정보를 삭제합니다."); - userService.deleteUserName(num); - } - case 6 -> { - System.out.println("변경할 프로필 번호를 입력해 주세요."); - userService.outputAllUsersInfo(); - int loginNumber = Integer.parseInt(sc.nextLine()); - userService.login(loginNumber); - loginUser = userService.changeUser(loginNumber); - } - case 7 -> { - return; - } - default -> System.out.println("올바른 번호를 입력해 주세요."); - } - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java new file mode 100644 index 00000000..2a61dd62 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface BinaryContentRepository { + BinaryContent save(BinaryContent binaryContent); + + Optional findById(UUID id); + + List findAllByIdIn(List ids); + + boolean existsById(UUID id); + + void deleteById(UUID id); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 18c8393a..014ebcb2 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,17 +1,18 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.Channel; -import java.util.Map; +import java.util.List; +import java.util.Optional; +import java.util.UUID; public interface ChannelRepository { + Channel save(Channel channel); - void saveChannel(Channel channel); + Optional findById(UUID id); - Channel updateChannel(Channel channel); + List findAll(); - void deleteChannel(int channelNumber); + boolean existsById(UUID id); - Channel findChannel(int channelNumber); - - Map findAllChannel(); -} \ No newline at end of file + void deleteById(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/DefaultChannelFactory.java b/src/main/java/com/sprint/mission/discodeit/repository/DefaultChannelFactory.java deleted file mode 100644 index bf3a26d3..00000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/DefaultChannelFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sprint.mission.discodeit.repository; - -import com.sprint.mission.discodeit.entity.Channel; -import java.util.Arrays; -import java.util.List; - -public class DefaultChannelFactory { - public static List getChannel() { - return Arrays.asList( - new Channel("코드잇 스프린트:스프링 백엔드 3기"), - new Channel("코드잇 커뮤니티"), - new Channel("알고리즘 스터디"), - new Channel("CS 스터디") - ); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 939e14cc..8b26d6bc 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -2,16 +2,21 @@ import com.sprint.mission.discodeit.entity.Message; import java.util.List; +import java.util.Optional; +import java.util.UUID; public interface MessageRepository { + Message save(Message message); - void saveMessage(Message message); + Optional findById(UUID id); - void updateMessage(Message message); + List findAll(); - void deleteMessage(int messageNumber); + List findAllByChannelId(UUID channelId); - Message findMessage(int messageNumber); + void deleteAllByChannelId(UUID channelId); - List findAllMessage(); -} \ No newline at end of file + boolean existsById(UUID id); + + void deleteById(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java new file mode 100644 index 00000000..8398de6c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ReadStatusRepository { + ReadStatus save(ReadStatus readStatus); + + Optional findById(UUID id); + + List findAllByUserId(UUID userId); + + List findAllByChannelId(UUID channelId); + + boolean existsById(UUID id); + + void deleteById(UUID id); + + void deleteAllByChannelId(UUID channelId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index fb1898bf..54aedc07 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -2,16 +2,23 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; +import java.util.UUID; public interface UserRepository { + User save(User user); - void saveUser(User user); + Optional findById(UUID id); - void updateUser(User user); + List findAll(); - void deleteUser(int userNumber); + boolean existsById(UUID id); - User findUser(int userNumber); + void deleteById(UUID id); - List findAllUser(); -} \ No newline at end of file + boolean existsByUsername(String username); + + boolean existsByEmail(String email); + + Optional findByUserName(String userName); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java new file mode 100644 index 00000000..4030a81d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.UserStatus; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface UserStatusRepository { + UserStatus save(UserStatus userStatus); + + Optional findByUserId(UUID id); + + boolean existsById(UUID id); + + List findAll(); + + void deleteById(UUID id); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java new file mode 100644 index 00000000..a9f15a15 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -0,0 +1,90 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +public class FileBinaryContentRepository implements BinaryContentRepository { + + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileBinaryContentRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, BinaryContent.class.getSimpleName()); + try { + if (Files.notExists(DIRECTORY)) { + Files.createDirectories(DIRECTORY); + } + } catch (IOException e) { + throw new RuntimeException("BinaryContent 저장 디렉토리를 생성하는 중 오류가 발생했습니다."); + } + } + + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + Path path = resolvePath(binaryContent.getId()); + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path.toFile()))) { + oos.writeObject(binaryContent); + } catch (IOException e) { + throw new RuntimeException("BinaryContent 저장 중 오류가 발생하였습니다."); + } + return binaryContent; + } + + @Override + public Optional findById(UUID id) { + Path path = resolvePath(id); + if (!Files.exists(path)) { + return Optional.empty(); + } + + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return Optional.of((BinaryContent) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("BinaryContent 로딩 중 오류가 발생하였습니다."); + } + } + + @Override + public List findAllByIdIn(List ids) { + return ids.stream() + .map(this::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } + + @Override + public boolean existsById(UUID id) { + return Files.exists(resolvePath(id)); + } + + @Override + public void deleteById(UUID id) { + try { + Files.deleteIfExists(resolvePath(id)); + } catch (IOException e) { + throw new RuntimeException("BinaryContent 삭제 중 오류가 발생하였습니다."); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 58ee2680..4d7ba5ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,85 +2,92 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.DefaultChannelFactory; -import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.util.HashMap; -import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") public class FileChannelRepository implements ChannelRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; - private final String FILEPATH = "channels.ser"; - private Map channelMap; - - public FileChannelRepository() { - channelMap = loadChannels(); - if (channelMap == null || channelMap.isEmpty()) { - channelMap = new HashMap<>(); - for (Channel ch : DefaultChannelFactory.getChannel()) { - channelMap.put(ch.getChannelNumber(), ch); - } - saveChannels(); - } else { - int max = channelMap.keySet().stream().mapToInt(Integer::intValue).max().orElse(0); - Channel.setCounter(max + 1); + public FileChannelRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, Channel.class.getSimpleName()); + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException("Channel 디렉토리 생성 오류", e); } } - private Map loadChannels() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; - } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (Map) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return null; + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); } - private void saveChannels() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(channelMap); + @Override + public Channel save(Channel channel) { + try (ObjectOutputStream oos = new ObjectOutputStream( + new FileOutputStream(resolvePath(channel.getId()).toFile()))) { + oos.writeObject(channel); } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException("Channel 저장 오류", e); } + return channel; } @Override - public void saveChannel(Channel channel) { - channelMap.put(channel.getChannelNumber(), channel); - saveChannels(); - } - - @Override - public Channel updateChannel(Channel channel) { - if (channelMap.containsKey(channel.getChannelNumber())) { - channelMap.put(channel.getChannelNumber(), channel); - saveChannels(); - return channel; + public Optional findById(UUID id) { + Path path = resolvePath(id); + if (Files.exists(path)) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return Optional.of((Channel) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Channel 읽기 오류", e); + } } - return null; + return Optional.empty(); } @Override - public void deleteChannel(int channelNumber) { - channelMap.remove(channelNumber); - saveChannels(); + public List findAll() { + try { + return Files.list(DIRECTORY) + .filter(p -> p.toString().endsWith(EXTENSION)) + .map(path -> { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return (Channel) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Channel 목록 읽기 오류", e); + } + }).toList(); + } catch (IOException e) { + throw new RuntimeException("Channel 디렉토리 탐색 오류", e); + } } @Override - public Channel findChannel(int channelNumber) { - return channelMap.get(channelNumber); + public boolean existsById(UUID id) { + return Files.exists(resolvePath(id)); } @Override - public Map findAllChannel() { - return channelMap; + public void deleteById(UUID id) { + try { + Files.deleteIfExists(resolvePath(id)); + } catch (IOException e) { + throw new RuntimeException("Channel 삭제 오류", e); + } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index c0997281..bb9f79ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -2,81 +2,105 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; -import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.util.ArrayList; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") public class FileMessageRepository implements MessageRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; - private final String FILEPATH = "messages.ser"; - private List messages; - - public FileMessageRepository() { - messages = loadMessages(); - if (messages == null) { - messages = new ArrayList<>(); - } else { - int max = messages.stream().mapToInt(Message::getNumber).max().orElse(0); - Message.setCounter(max + 1); + public FileMessageRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, Message.class.getSimpleName()); + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException("Message 디렉토리 생성 오류", e); } } - @SuppressWarnings("unchecked") - private List loadMessages() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; - } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return null; + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); } - private void saveMessages() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(messages); + @Override + public Message save(Message message) { + try (ObjectOutputStream oos = new ObjectOutputStream( + new FileOutputStream(resolvePath(message.getId()).toFile()))) { + oos.writeObject(message); } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException("Message 저장 오류", e); } + return message; } @Override - public void saveMessage(Message message) { - messages.add(message); - saveMessages(); + public Optional findById(UUID id) { + Path path = resolvePath(id); + if (Files.exists(path)) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return Optional.of((Message) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Message 읽기 오류", e); + } + } + return Optional.empty(); } @Override - public void updateMessage(Message message) { - deleteMessage(message.getNumber()); - messages.add(message); - saveMessages(); + public List findAll() { + try { + return Files.list(DIRECTORY) + .filter(p -> p.toString().endsWith(EXTENSION)) + .map(path -> { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return (Message) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Message 목록 읽기 오류", e); + } + }).toList(); + } catch (IOException e) { + throw new RuntimeException("Message 디렉토리 탐색 오류", e); + } + } + + @Override + public List findAllByChannelId(UUID channelId) { + return findAll().stream() + .filter(m -> m.getChannelId().equals(channelId)) + .collect(Collectors.toList()); } @Override - public void deleteMessage(int messageNumber) { - messages.removeIf(m -> m.getNumber() == messageNumber); - saveMessages(); + public void deleteAllByChannelId(UUID channelId) { + findAllByChannelId(channelId).forEach(m -> deleteById(m.getId())); } @Override - public Message findMessage(int messageNumber) { - return messages.stream() - .filter(m -> m.getNumber() == messageNumber) - .findFirst() - .orElse(null); + public boolean existsById(UUID id) { + return Files.exists(resolvePath(id)); } @Override - public List findAllMessage() { - return messages; + public void deleteById(UUID id) { + try { + Files.deleteIfExists(resolvePath(id)); + } catch (IOException e) { + throw new RuntimeException("Message 삭제 오류", e); + } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java new file mode 100644 index 00000000..34e9bb50 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -0,0 +1,112 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +public class FileReadStatusRepository implements ReadStatusRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileReadStatusRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, ReadStatus.class.getSimpleName()); + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException("ReadStatus 디렉토리 생성 오류", e); + } + } + + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + try (ObjectOutputStream oos = new ObjectOutputStream( + new FileOutputStream(resolvePath(readStatus.getId()).toFile()))) { + oos.writeObject(readStatus); + } catch (IOException e) { + throw new RuntimeException("ReadStatus 저장 오류", e); + } + return readStatus; + } + + @Override + public Optional findById(UUID id) { + Path path = resolvePath(id); + if (Files.exists(path)) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return Optional.of((ReadStatus) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("ReadStatus 읽기 오류", e); + } + } + return Optional.empty(); + } + + @Override + public List findAllByUserId(UUID userId) { + return findAll().stream() + .filter(r -> r.getUserId().equals(userId)) + .collect(Collectors.toList()); + } + + @Override + public List findAllByChannelId(UUID channelId) { + return findAll().stream() + .filter(r -> r.getChannelId().equals(channelId)) + .collect(Collectors.toList()); + } + + private List findAll() { + try { + return Files.list(DIRECTORY) + .filter(p -> p.toString().endsWith(EXTENSION)) + .map(path -> { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return (ReadStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("ReadStatus 전체 읽기 오류", e); + } + }).toList(); + } catch (IOException e) { + throw new RuntimeException("ReadStatus 디렉토리 탐색 오류", e); + } + } + + @Override + public boolean existsById(UUID id) { + return Files.exists(resolvePath(id)); + } + + @Override + public void deleteById(UUID id) { + try { + Files.deleteIfExists(resolvePath(id)); + } catch (IOException e) { + throw new RuntimeException("ReadStatus 삭제 오류", e); + } + } + + @Override + public void deleteAllByChannelId(UUID channelId) { + findAllByChannelId(channelId).forEach(r -> deleteById(r.getId())); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 30f4cdc9..ca42e5f1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,85 +2,125 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; -import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.util.ArrayList; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") public class FileUserRepository implements UserRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; - private final String FILEPATH = "users.ser"; - private List users; - - public FileUserRepository() { - users = loadUsers(); - if (users == null) { - users = new ArrayList<>(); - } else { - int max = users.stream().mapToInt(User::getNumber).max().orElse(0); - User.setCounter(max + 1); + public FileUserRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, User.class.getSimpleName()); + if (Files.notExists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException("User 저장 디렉토리 생성 중 오류 발생", e); + } } } - @SuppressWarnings("unchecked") - private List loadUsers() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; + private Path resolvePath(UUID id) { + return DIRECTORY.resolve(id + EXTENSION); + } + + @Override + public User save(User user) { + try (ObjectOutputStream oos = new ObjectOutputStream( + new FileOutputStream(resolvePath(user.getId()).toFile()))) { + oos.writeObject(user); + } catch (IOException e) { + throw new RuntimeException("User 저장 중 오류 발생", e); } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); + return user; + } + + @Override + public Optional findById(UUID id) { + Path path = resolvePath(id); + if (Files.exists(path)) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return Optional.of((User) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("User 로드 중 오류 발생", e); + } } - return null; + return Optional.empty(); } - private void saveUsers() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(users); + @Override + public List findAll() { + try { + return Files.list(DIRECTORY) + .filter(p -> p.toString().endsWith(EXTENSION)) + .map(path -> { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return (User) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("User 전체 조회 중 오류 발생", e); + } + }).toList(); } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException("디렉토리 로드 오류", e); } } @Override - public void saveUser(User user) { - users.add(user); - saveUsers(); + public Optional findByUserName(String userName) { + try { + return Files.list(DIRECTORY) + .filter(p -> p.toString().endsWith(EXTENSION)) + .map(path -> { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path.toFile()))) { + return (User) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("User 전체 조회 중 오류 발생", e); + } + }) + .filter(u -> u.getUsername().equals(userName)) + .findFirst(); + } catch (IOException e) { + throw new RuntimeException("디렉토리 로드 오류", e); + } } @Override - public void updateUser(User user) { - for (int i = 0; i < users.size(); i++) { - if (users.get(i).getNumber() == user.getNumber()) { - users.set(i, user); - saveUsers(); - return; - } - } + public boolean existsById(UUID id) { + return Files.exists(resolvePath(id)); } @Override - public void deleteUser(int userNumber) { - users.removeIf(u -> u.getNumber() == userNumber); - saveUsers(); + public boolean existsByUsername(String username) { + return findAll().stream() + .anyMatch(user -> user.getUsername().equals(username)); } @Override - public User findUser(int userNumber) { - return users.stream() - .filter(u -> u.getNumber() == userNumber) - .findFirst() - .orElse(null); + public boolean existsByEmail(String email) { + return findAll().stream() + .anyMatch(user -> user.getEmail().equals(email)); } @Override - public List findAllUser() { - return users; + public void deleteById(UUID id) { + try { + Files.deleteIfExists(resolvePath(id)); + } catch (IOException e) { + throw new RuntimeException("User 삭제 중 오류 발생", e); + } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java new file mode 100644 index 00000000..dd7bb5a6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -0,0 +1,106 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +public class FileUserStatusRepository implements UserStatusRepository { + private final Path DIRECTORY; + private final String EXTENSION = ".ser"; + + public FileUserStatusRepository(@Value("${discodeit.repository.file-directory}") String directory) { + this.DIRECTORY = Paths.get(System.getProperty("user.dir"), directory, UserStatus.class.getSimpleName()); + if (Files.notExists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + private Path resolvePath(UUID userId) { + return DIRECTORY.resolve(userId.toString() + EXTENSION); + } + + @Override + public UserStatus save(UserStatus userStatus) { + Path path = resolvePath(userStatus.getUserId()); + try ( + FileOutputStream fos = new FileOutputStream(path.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos)) { + oos.writeObject(userStatus); + } catch (IOException e) { + throw new RuntimeException(e); + } + return userStatus; + } + + @Override + public Optional findByUserId(UUID id) { + Path path = resolvePath(id); + if (Files.exists(path)) { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis)) { + return Optional.of((UserStatus) ois.readObject()); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + return Optional.empty(); + } + + @Override + public List findAll() { + try { + return Files.list(DIRECTORY) + .filter(path -> path.toString().endsWith(EXTENSION)) + .map(path -> { + try ( + FileInputStream fis = new FileInputStream(path.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + return (UserStatus) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + }) + .toList(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean existsById(UUID id) { + Path path = resolvePath(id); + return Files.exists(path); + } + + + @Override + public void deleteById(UUID id) { + Path path = resolvePath(id); + try { + Files.deleteIfExists(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java new file mode 100644 index 00000000..84dd8cc0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true) +public class JCFBinaryContentRepository implements BinaryContentRepository { + private final Map store = new HashMap<>(); + + @Override + public BinaryContent save(BinaryContent binaryContent) { + store.put(binaryContent.getId(), binaryContent); + return binaryContent; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(store.get(id)); + } + + @Override + public List findAllByIdIn(List ids) { + List result = new ArrayList<>(); + for (UUID id : ids) { + if (store.containsKey(id)) { + result.add(store.get(id)); + } + } + return result; + } + + @Override + public boolean existsById(UUID id) { + return store.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + store.remove(id); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index f4df5726..14658b9a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,44 +2,44 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; -public class JCFChannelRepository implements ChannelRepository { - - private final Map channelMap; - - public JCFChannelRepository() { +@Repository - channelMap = new HashMap<>(); - } +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf") +public class JCFChannelRepository implements ChannelRepository { + private final Map store = new HashMap<>(); @Override - public void saveChannel(Channel channel) { - channelMap.put(channel.getChannelNumber(), channel); + public Channel save(Channel channel) { + store.put(channel.getId(), channel); + return channel; } @Override - public Channel updateChannel(Channel channel) { - if (channelMap.containsKey(channel.getChannelNumber())) { - channelMap.put(channel.getChannelNumber(), channel); - return channel; - } - return null; + public Optional findById(UUID id) { + return Optional.ofNullable(store.get(id)); } @Override - public void deleteChannel(int channelNumber) { - channelMap.remove(channelNumber); + public List findAll() { + return new ArrayList<>(store.values()); } @Override - public Channel findChannel(int channelNumber) { - return channelMap.get(channelNumber); + public boolean existsById(UUID id) { + return store.containsKey(id); } @Override - public Map findAllChannel() { - return channelMap; + public void deleteById(UUID id) { + store.remove(id); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index e958155a..743493a8 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -3,42 +3,56 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; +@Repository + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf") public class JCFMessageRepository implements MessageRepository { + private final Map store = new HashMap<>(); - private final List messages; + @Override + public Message save(Message message) { + store.put(message.getId(), message); + return message; + } - public JCFMessageRepository() { - messages = new ArrayList<>(); + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(store.get(id)); } @Override - public void saveMessage(Message message) { - messages.add(message); + public List findAll() { + return new ArrayList<>(store.values()); } @Override - public void updateMessage(Message message) { - deleteMessage(message.getNumber()); - messages.add(message); + public List findAllByChannelId(UUID channelId) { + return store.values().stream() + .filter(msg -> msg.getChannelId().equals(channelId)) + .collect(Collectors.toList()); } @Override - public void deleteMessage(int messageNumber) { - messages.removeIf(msg -> msg.getNumber() == messageNumber); + public void deleteAllByChannelId(UUID channelId) { + store.values().removeIf(msg -> msg.getChannelId().equals(channelId)); } @Override - public Message findMessage(int messageNumber) { - return messages.stream() - .filter(msg -> msg.getNumber() == messageNumber) - .findFirst() - .orElse(null); + public boolean existsById(UUID id) { + return store.containsKey(id); } @Override - public List findAllMessage() { - return messages; + public void deleteById(UUID id) { + store.remove(id); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java new file mode 100644 index 00000000..4d550ea8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -0,0 +1,58 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf") +public class JCFReadStatusRepository implements ReadStatusRepository { + private final Map store = new HashMap<>(); + + @Override + public ReadStatus save(ReadStatus readStatus) { + store.put(readStatus.getId(), readStatus); + return readStatus; + } + + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(store.get(id)); + } + + @Override + public List findAllByUserId(UUID userId) { + return store.values().stream() + .filter(rs -> rs.getUserId().equals(userId)) + .collect(Collectors.toList()); + } + + @Override + public List findAllByChannelId(UUID channelId) { + return store.values().stream() + .filter(rs -> rs.getChannelId().equals(channelId)) + .collect(Collectors.toList()); + } + + @Override + public boolean existsById(UUID id) { + return store.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + store.remove(id); + } + + @Override + public void deleteAllByChannelId(UUID channelId) { + store.values().removeIf(rs -> rs.getChannelId().equals(channelId)); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index e19b8f59..ba9b68ba 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -3,46 +3,63 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf") public class JCFUserRepository implements UserRepository { + private final Map store = new HashMap<>(); + + @Override + public User save(User user) { + store.put(user.getId(), user); + return user; + } - private final List users; + @Override + public Optional findById(UUID id) { + return Optional.ofNullable(store.get(id)); + } - public JCFUserRepository() { - users = new ArrayList<>(); + @Override + public List findAll() { + return new ArrayList<>(store.values()); } @Override - public void saveUser(User user) { - users.add(user); + public boolean existsById(UUID id) { + return store.containsKey(id); } @Override - public void updateUser(User user) { - for (int i = 0; i < users.size(); i++) { - if (users.get(i).getNumber() == user.getNumber()) { - users.set(i, user); - break; - } - } + public void deleteById(UUID id) { + store.remove(id); } @Override - public void deleteUser(int userNumber) { - users.removeIf(user -> user.getNumber() == userNumber); + public boolean existsByUsername(String username) { + return store.values().stream() + .anyMatch(user -> user.getUsername().equals(username)); } @Override - public User findUser(int userNumber) { - return users.stream() - .filter(user -> user.getNumber() == userNumber) - .findFirst() - .orElse(null); + public boolean existsByEmail(String email) { + return store.values().stream() + .anyMatch(user -> user.getEmail().equals(email)); } @Override - public List findAllUser() { - return users; + public Optional findByUserName(String userName) { + return store.values().stream() + .filter(u -> u.getUsername().equals(userName)) + .findFirst(); } + } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java new file mode 100644 index 00000000..daa5df57 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -0,0 +1,45 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +@Repository +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf") + +public class JCFUserStatusRepository implements UserStatusRepository { + private final Map store = new HashMap<>(); + + @Override + public UserStatus save(UserStatus userStatus) { + store.put(userStatus.getUserId(), userStatus); + return userStatus; + } + + @Override + public Optional findByUserId(UUID userId) { + return Optional.ofNullable(store.get(userId)); + } + + @Override + public List findAll() { + return new ArrayList<>(store.values()); + } + + @Override + public boolean existsById(UUID id) { + return store.containsKey(id); + } + + @Override + public void deleteById(UUID id) { + store.remove(id); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 00000000..5fb3cee9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginReponse; +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginRequest; + +public interface AuthService { + public AuthLoginReponse login(AuthLoginRequest request); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java new file mode 100644 index 00000000..63e195d0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.BinaryContent.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface BinaryContentService { + public BinaryContent create(BinaryContentCreateRequest request); + + public Optional find(UUID id); + + public List findAllByIdIn(List ids); + + public void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index c3120f04..9fcf8822 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,23 +1,24 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.Channel.ChannelFindRequest; +import com.sprint.mission.discodeit.dto.Channel.ChannelResponse; +import com.sprint.mission.discodeit.dto.Channel.ChannelUpdateRequest; +import com.sprint.mission.discodeit.dto.Channel.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.Channel.PublicChannelCreateRequest; import com.sprint.mission.discodeit.entity.Channel; +import java.util.List; +import java.util.UUID; public interface ChannelService { + public Channel create(PublicChannelCreateRequest request); - public void outputAllChannelInfo(); + public Channel create(PrivateChannelCreateRequest request); - public void outputOneChannelInfo(Channel channel); + public ChannelResponse find(ChannelFindRequest request); - public void updateChannelName(Channel currentChannel, String newName); + public List findAllByUserId(UUID userId); - public void deleteChannelName(Channel currentChannel); - - public void createNewChannel(String channelName); - - public Channel getChannelByNumber(int channelNumber); - - public void selectChannel(int channelNumber); - - public Channel getCurrentChannel(); + public Channel update(ChannelUpdateRequest request); + public void delete(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 8675d42e..05b5af8a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,14 +1,21 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.BinaryContent.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.Message.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.Message.MessageUpdateRequest; import com.sprint.mission.discodeit.entity.Message; import java.util.List; +import java.util.UUID; public interface MessageService { - public List inputMessage(String newMessage); + public Message create(MessageCreateRequest messageCreateRequest, + List binaryContentCreateRequests); - public void outputUserMessage(); + public Message find(UUID messageId); - public void updateUserMessage(int number, String newMessage); + public List findAllByChannelId(UUID channelId); - public void deleteUserMessage(int number); -} \ No newline at end of file + public Message update(MessageUpdateRequest request); + + public void delete(UUID messageId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java new file mode 100644 index 00000000..711eeaad --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.ReadStatus.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.ReadStatus.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.ReadStatus; +import java.util.List; +import java.util.UUID; + +public interface ReadStatusService { + public ReadStatus create(ReadStatusCreateRequest request); + + public ReadStatus find(UUID readStatusId); + + public List findAllByUserId(UUID userId); + + public ReadStatus update(ReadStatusUpdateRequest request); + + public void delete(UUID readStatusId); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 2b8decd9..da3c103c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,22 +1,22 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.User.UserCreateRequest; +import com.sprint.mission.discodeit.dto.User.UserFindRequest; +import com.sprint.mission.discodeit.dto.User.UserResponse; +import com.sprint.mission.discodeit.dto.User.UserUpdateRequest; import com.sprint.mission.discodeit.entity.User; +import java.util.List; import java.util.UUID; -public interface UserService { - public User registerUser(); - - public void createNewUserNames(String existingName, String newName); - public void outputAllUsersInfo(); - - public void outputOneUserInfo(UUID uuid); +public interface UserService { + public User create(UserCreateRequest userCreateRequest); - public void updateUserName(User user, String newName); + public UserResponse find(UserFindRequest userFindRequest); - public void deleteUserName(int userNumber); + public List findAll(); - public User changeUser(int userNumber); + public User update(UserUpdateRequest request); - public void login(int loginNumber); + public void delete(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java new file mode 100644 index 00000000..39090fc0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -0,0 +1,21 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.UserStatus.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.UserStatus.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.UserStatus; +import java.util.List; +import java.util.UUID; + +public interface UserStatusService { + public UserStatus create(UserStatusCreateRequest request); + + public UserStatus find(UUID id); + + public List findAll(); + + public UserStatus update(UserStatusUpdateRequest request); + + public UserStatus updateByUserId(UserStatusUpdateRequest request); + + public void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BaiscUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BaiscUserStatusService.java new file mode 100644 index 00000000..cf444226 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BaiscUserStatusService.java @@ -0,0 +1,73 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.UserStatus.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.UserStatus.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.service.UserStatusService; +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class BaiscUserStatusService implements UserStatusService { + private final UserStatusRepository userStatusRepository; + private final UserRepository userRepository; + + @Override + public UserStatus create(UserStatusCreateRequest request) { + UUID userId = request.userId(); + + if (!userRepository.existsById(userId)) { + throw new NoSuchElementException("해당 유저는 존재하지 않습니다."); + } + if (!userStatusRepository.existsById(userId)) { + throw new RuntimeException("해당 유저의 정보는 이미 등록되어 있습니다."); + } + + Instant recentStatusAt = request.recentStatusAt(); + UserStatus userStatus = new UserStatus(recentStatusAt, request.userId()); + + return userStatusRepository.save(userStatus); + } + + @Override + public UserStatus find(UUID id) { + return userStatusRepository.findByUserId(id) + .orElseThrow(() -> new NoSuchElementException("해당하는 id는 존재하지 않습니다.")); + } + + @Override + public List findAll() { + return userStatusRepository.findAll().stream().toList(); + } + + @Override + public UserStatus update(UserStatusUpdateRequest request) { + UserStatus updatedUserStatus = userStatusRepository.findByUserId(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 id는 존재하지 않아 업데이트가 불가능 합니다.")); + updatedUserStatus.update(request.StatusAt()); + return userStatusRepository.save(updatedUserStatus); + } + + @Override + public UserStatus updateByUserId(UserStatusUpdateRequest request) { + UserStatus updatedUserStatus = userStatusRepository.findByUserId(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 유저의 id가 존재하지 않아 업데이트가 불가능 합니다.")); + updatedUserStatus.update(request.StatusAt()); + return userStatusRepository.save(updatedUserStatus); + } + + @Override + public void delete(UUID id) { + if (!userStatusRepository.existsById(id)) { + throw new NoSuchElementException("해당 id는 존재하지 않아 삭제가 불가능합니다."); + } + userStatusRepository.deleteById(id); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java new file mode 100644 index 00000000..1bd3b00e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -0,0 +1,31 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginReponse; +import com.sprint.mission.discodeit.dto.AuthLogin.AuthLoginRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.AuthService; +import java.util.NoSuchElementException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class BasicAuthService implements AuthService { + private final UserRepository userRepository; + + public AuthLoginReponse login(AuthLoginRequest request) { + + User user = userRepository.findByUserName(request.userName()) + .orElseThrow(() -> new NoSuchElementException("해당하는 유저는 존재하지 않습니다.")); + + if (user.getUsername().equals(request.userName()) && user.getPassword().equals(request.password())) { + return AuthLoginReponse.builder() + .userName(user.getUsername()) + .email(user.getEmail()) + .build(); + } else { + throw new IllegalArgumentException("유저이름, 비밀번호가 틀립니다. 프로그램을 종료합니다."); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java new file mode 100644 index 00000000..883ff311 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -0,0 +1,44 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.BinaryContent.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.service.BinaryContentService; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class BasicBinaryContentService implements BinaryContentService { + private final BinaryContentRepository binaryContentRepository; + + @Override + public BinaryContent create(BinaryContentCreateRequest request) { + BinaryContent binaryContent = new BinaryContent(request.fileName(), request.contentType(), request.bytes()); + return binaryContentRepository.save(binaryContent); + } + + @Override + public Optional find(UUID id) { + if (!binaryContentRepository.existsById(id)) { + throw new RuntimeException("해당 ID는 존재하지 않습니다."); + } + return binaryContentRepository.findById(id); + } + + @Override + public List findAllByIdIn(List ids) { + return binaryContentRepository.findAllByIdIn(ids); + } + + @Override + public void delete(UUID id) { + if (!binaryContentRepository.existsById(id)) { + throw new RuntimeException("해당 ID는 존재하지 않습니다."); + } + binaryContentRepository.deleteById(id); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 8420e742..4006fd0f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,68 +1,150 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.Channel.ChannelFindRequest; +import com.sprint.mission.discodeit.dto.Channel.ChannelResponse; +import com.sprint.mission.discodeit.dto.Channel.ChannelUpdateRequest; +import com.sprint.mission.discodeit.dto.Channel.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.Channel.PublicChannelCreateRequest; import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.service.ChannelService; +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +@Service +@RequiredArgsConstructor public class BasicChannelService implements ChannelService { - private final ChannelRepository channelRepo; - - public BasicChannelService(ChannelRepository channelRepo) { - this.channelRepo = channelRepo; - } + private final ChannelRepository channelRepository; + private final MessageRepository messageRepository; + private final ReadStatusRepository readStatusRepository; @Override - public void outputAllChannelInfo() { - channelRepo.findAllChannel().values().forEach(System.out::println); + public Channel create(PublicChannelCreateRequest request) { + Channel channel = new Channel(ChannelType.PUBLIC, request.channelName(), request.description()); + return channelRepository.save(channel); } @Override - public void outputOneChannelInfo(Channel channel) { - Channel c = channelRepo.findChannel(channel.getChannelNumber()); - if (channel == null) { - System.out.println("해당 채널은 존재하지 않습니다."); - } else { - System.out.println(c); - } + public Channel create(PrivateChannelCreateRequest request) { + Channel channel = new Channel(ChannelType.PRIVATE, null, null); + Channel createChannel = channelRepository.save(channel); + request.participantsIds().stream().map(userId -> new ReadStatus(userId, createChannel.getId(), Instant.MIN)) + .forEach(readStatusRepository::save); + + return channelRepository.save(channel); } + @Override - public void updateChannelName(Channel currentChannel, String newName) { - Channel channel = channelRepo.findChannel(currentChannel.getChannelNumber()); - if (channel != null) { - channel.setChannelName(newName); - channelRepo.updateChannel(channel); + public ChannelResponse find(ChannelFindRequest request) { + Channel channel = channelRepository.findById(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 채널은 없습니다.")); + + Instant recentMessageAt = readStatusRepository.findAllByChannelId(channel.getId()).stream() + .map(ReadStatus::getLastReadAt).max(Instant::compareTo) + .orElse(null); + + List participantIds = readStatusRepository.findAllByChannelId(channel.getId()).stream() + .map(ReadStatus::getUserId) + .toList(); + + if (channel.getType().equals(ChannelType.PUBLIC)) { + return ChannelResponse.builder() + .id(channel.getId()) + .type(channel.getType()) + .name(channel.getName()) + .description(channel.getDescription()) + .lastMessageAt(recentMessageAt) + .participantIds(null) + .build(); } else { - System.out.println("해당 채널을 찾을 수 없습니다."); + return ChannelResponse.builder() + .id(channel.getId()) + .type(channel.getType()) + .name(channel.getName()) + .description(channel.getDescription()) + .lastMessageAt(recentMessageAt) + .participantIds(participantIds) + .build(); } - } - @Override - public void deleteChannelName(Channel currentChannel) { - channelRepo.deleteChannel(currentChannel.getChannelNumber()); } + @Override - public void createNewChannel(String channelName) { - Channel channel = new Channel(channelName); - channelRepo.saveChannel(channel); + public List findAllByUserId(UUID userId) { + List mySubscribedChannelIds = readStatusRepository.findAllByUserId(userId).stream() + .map(ReadStatus::getChannelId) + .toList(); + + return channelRepository.findAll().stream() + .filter(channel -> + channel.getType() == ChannelType.PUBLIC + || mySubscribedChannelIds.contains(channel.getId()) + ) + .map(this::toResponse) + .toList(); } - @Override - public Channel getChannelByNumber(int channelNumber) { - return channelRepo.findChannel(channelNumber); + private ChannelResponse toResponse(Channel channel) { + + Instant lastMessageAt = messageRepository.findAllByChannelId(channel.getId()).stream() + .map(Message::getCreatedAt) + .filter(Objects::nonNull) + .max(Instant::compareTo) + .orElse(null); + + List participantIds = null; + if (channel.getType() == ChannelType.PRIVATE) { + participantIds = readStatusRepository.findAllByChannelId(channel.getId()).stream() + .map(ReadStatus::getUserId) + .toList(); + } + + return ChannelResponse.builder() + .id(channel.getId()) + .type(channel.getType()) + .name(channel.getName()) + .description(channel.getDescription()) + .lastMessageAt(lastMessageAt) + .participantIds(participantIds) + .build(); } + @Override - public void selectChannel(int channelNumber) { - Channel currentChannel = channelRepo.findChannel(channelNumber); - if (currentChannel == null) { - System.out.println("유효하지 않은 채널 번호입니다."); + public Channel update(ChannelUpdateRequest request) { + Channel channel = channelRepository.findById(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 채널은 없습니다.")); + + if (request.type().equals(ChannelType.PRIVATE)) { + throw new RuntimeException("Private 채널은 수정할 수 없습니다. "); + } else { + channel.update(request.name(), request.description()); } + + return channelRepository.save(channel); } @Override - public Channel getCurrentChannel() { - return null; + public void delete(UUID channelId) { + if (!channelRepository.existsById(channelId)) { + throw new NoSuchElementException("해당 id를 가진 채널은 없습니다."); + } + channelRepository.deleteById(channelId); + readStatusRepository.deleteAllByChannelId(channelId); + messageRepository.deleteAllByChannelId(channelId); + } -} \ No newline at end of file +} + diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 9e2813b4..60bc3f73 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,42 +1,79 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.BinaryContent.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.Message.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.Message.MessageUpdateRequest; import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +@Service +@RequiredArgsConstructor public class BasicMessageService implements MessageService { - private final MessageRepository messageRepo; + private final MessageRepository messageRepository; + private final ChannelRepository channelRepository; + private final UserRepository userRepository; + private final BinaryContentRepository binaryContentRepository; - public BasicMessageService(MessageRepository messageRepo) { - this.messageRepo = messageRepo; + + @Override + public Message create(MessageCreateRequest messageCreateRequest, + List binaryContentCreateRequests) { + UUID channelId = messageCreateRequest.channelId(); + UUID authorId = messageCreateRequest.authorId(); + + if (!channelRepository.existsById(messageCreateRequest.channelId())) { + throw new NoSuchElementException("해당 id를 가진 채널은 없습니다."); + } + if (!userRepository.existsById(messageCreateRequest.authorId())) { + throw new NoSuchElementException("해당 id를 가진 유저는 없습니다."); + } + + String content = messageCreateRequest.content(); + Message message = new Message( + content, + channelId, + authorId, + null + ); + return messageRepository.save(message); } @Override - public List inputMessage(String newMessage) { - Message message = new Message(newMessage); - messageRepo.saveMessage(message); - return messageRepo.findAllMessage(); + public Message find(UUID messageId) { + return messageRepository.findById(messageId) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 메시지는 없습니다.")); } @Override - public void outputUserMessage() { - for (Message message : messageRepo.findAllMessage()) { - System.out.println(message); - } + public List findAllByChannelId(UUID channelId) { + return messageRepository.findAllByChannelId(channelId).stream().toList(); } @Override - public void updateUserMessage(int number, String newMessage) { - Message message = messageRepo.findMessage(number); - if (message != null) { - message.setMessage(newMessage); - messageRepo.updateMessage(message); - } + public Message update(MessageUpdateRequest request) { + Message message = messageRepository.findById(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 메시지은 없습니다.")); + message.update(request.content()); + return messageRepository.save(message); } @Override - public void deleteUserMessage(int number) { - messageRepo.deleteMessage(number); + public void delete(UUID messageId) { + Message message = messageRepository.findById(messageId) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 메시지은 없습니다.")); + + message.getAttachmentIds() + .forEach(binaryContentRepository::deleteById); + + messageRepository.deleteById(messageId); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java new file mode 100644 index 00000000..866f1b28 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -0,0 +1,73 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.ReadStatus.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.ReadStatus.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.ReadStatusService; +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class BasicReadStatusService implements ReadStatusService { + private final ReadStatusRepository readStatusRepository; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + + public ReadStatus create(ReadStatusCreateRequest request) { + UUID userId = request.userId(); + UUID channelId = request.channelId(); + + if (!userRepository.existsById(userId)) { + throw new NoSuchElementException("해당하는 유저 아이디 없습니다."); + } + + if (!channelRepository.existsById(channelId)) { + throw new NoSuchElementException("해당하는 채널 아이디 없습니다."); + } + if (readStatusRepository.findAllByUserId(request.userId()).stream() + .anyMatch(readStatus -> readStatus.getChannelId().equals(channelId))) { + throw new RuntimeException("이미 ReadStatus가 존재합니다."); + } + + Instant recentReadAt = request.recentReadAt(); + ReadStatus readStatus = new ReadStatus(userId, channelId, recentReadAt); + + return readStatusRepository.save(readStatus); + } + + public ReadStatus find(UUID readStatusId) { + return readStatusRepository.findById(readStatusId) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 ReadStatus는 없습니다.")); + } + + public List findAllByUserId(UUID userId) { + return readStatusRepository.findAllByUserId(userId).stream().toList(); + } + + + public ReadStatus update(ReadStatusUpdateRequest request) { + Instant newReadAt = request.newReadAt(); + + ReadStatus readStatus = readStatusRepository.findById(request.id()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 ReadStatus는 없습니다.")); + + readStatus.update(newReadAt); + return readStatusRepository.save(readStatus); + } + + + public void delete(UUID readStatusId) { + if (!readStatusRepository.existsById(readStatusId)) { + throw new NoSuchElementException("해당 id를 가진 ReadStatus는 없습니다."); + } + readStatusRepository.deleteById(readStatusId); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 25d3d707..4f7460f6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,97 +1,140 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.User.UserCreateRequest; +import com.sprint.mission.discodeit.dto.User.UserFindRequest; +import com.sprint.mission.discodeit.dto.User.UserResponse; +import com.sprint.mission.discodeit.dto.User.UserUpdateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; -import java.util.Scanner; +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +@Service +@RequiredArgsConstructor public class BasicUserService implements UserService { - private final UserRepository userRepo; - private static Scanner sc = new Scanner(System.in); - - public BasicUserService(UserRepository userRepo) { - this.userRepo = userRepo; - } + private final UserRepository userRepository; + private final UserStatusRepository userStatusRepository; + private final BinaryContentRepository binaryContentRepository; @Override - public User registerUser() { - System.out.println("안녕하세요. DisCodeit에 오신 걸 환영합니다."); - System.out.println("사용자의 이름을 입력해 주세요."); - - while (true) { - String name = sc.nextLine(); - User newUser; - boolean isDuplicate = userRepo.findAllUser().stream() - .anyMatch(u -> u.getUsername().equals(name.trim())); - - if (isDuplicate) { - System.out.println("이미 존재하는 이름입니다. 다시 입력해주세요."); - } else { - newUser = new User(name.trim()); - userRepo.saveUser(newUser); - System.out.println("새로운 프로필이 생성되었습니다."); - return newUser; - } - } + public User create(UserCreateRequest request) { + validateUniqueUser(request); - } + User user = new User(request.username(), request.email(), request.password(), request.content()); + if (request.content()) { //주강사님이 동적정적 바인딩? 불러오는거 안배웠다고 null로 표기하라고 하셨습니다. + BinaryContent profile = new BinaryContent( + null, + null, + null - @Override - public void createNewUserNames(String existingName, String newName) { - String trimmedNewName = newName.trim(); - - boolean isDuplicate = userRepo.findAllUser().stream() - .anyMatch(u -> u.getUsername().equals(trimmedNewName)); - - if (isDuplicate) { - System.out.println("이미 존재하는 이름입니다."); - } else { - User newUser = new User(trimmedNewName); - userRepo.saveUser(newUser); - System.out.println("새로운 프로필이 생성되었습니다."); + ); + binaryContentRepository.save(profile); + user.setProfileId(profile.getId()); } + + User savedUser = userRepository.save(user); + + UserStatus status = new UserStatus( + Instant.now(), + savedUser.getId() + ); + userStatusRepository.save(status); + + return savedUser; } - @Override - public void outputAllUsersInfo() { - for (User u : userRepo.findAllUser()) { - System.out.println(u); + private void validateUniqueUser(UserCreateRequest request) { + if (userRepository.existsByUsername(request.username())) { + throw new IllegalArgumentException("이미 존재하는 이름입니다."); + } + if (userRepository.existsByEmail(request.email())) { + throw new IllegalArgumentException("이미 존재하는 이메일입니다."); } } @Override - public void outputOneUserInfo(UUID uuid) { - userRepo.findAllUser().stream() - .filter(u -> u.getId().equals(uuid)) - .forEach(System.out::println); + public UserResponse find(UserFindRequest request) { + User user = userRepository.findById(request.userId()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 유저는 없습니다.")); + + boolean isOnline = userStatusRepository.findByUserId(user.getId()) + .map(status -> status.getUpdatedAt().isAfter(Instant.now().minusSeconds(300))) + .orElse(false); + + return UserResponse.builder() + .id(user.getId()) + .username(user.getUsername()) + .email(user.getEmail()) + .isOnline(isOnline) + .hasProfileImage(user.isHasProfileImage()) + .build(); } @Override - public void updateUserName(User user, String newName) { - if (user.getUsername().equals(newName.trim())) { - System.out.println("프로필 이름은 중복 될 수 없습니다."); - } else { - user.setUsername(newName); - userRepo.updateUser(user); - } + public List findAll() { + return userRepository.findAll().stream() + .map(user -> { + boolean isOnline = userStatusRepository.findByUserId(user.getId()) + .map(status -> status.getUpdatedAt().isAfter(Instant.now().minusSeconds(300))) + .orElse(false); + + return UserResponse.builder() + .id(user.getId()) + .username(user.getUsername()) + .email(user.getEmail()) + .isOnline(isOnline) + .hasProfileImage(user.isHasProfileImage()) + .build(); + }) + .toList(); } @Override - public void deleteUserName(int userNumber) { - userRepo.deleteUser(userNumber); - } + public User update(UserUpdateRequest request) { + User user = userRepository.findById(request.userId()) + .orElseThrow(() -> new NoSuchElementException("해당 id를 가진 유저는 없습니다.")); + + user.update(request.newUsername(), request.newEmail(), request.newPassword()); + + if (request.hasProfileImage()) { + BinaryContent profile = new BinaryContent( + null, + null, + null + ); + binaryContentRepository.save(profile); + user.setProfileId(profile.getId()); + } - @Override - public User changeUser(int userNumber) { - return userRepo.findUser(userNumber); + userRepository.save(user); + + userStatusRepository.findByUserId(user.getId()).ifPresent(status -> { + status.update(Instant.now()); + userStatusRepository.save(status); + }); + + return userRepository.save(user); } @Override - public void login(int loginNumber) { - if (userRepo.findUser(loginNumber) == null) { - throw new RuntimeException("해당 번호의 유저가 존재하지 않습니다"); + public void delete(UUID userId) { + if (!userRepository.existsById(userId)) { + throw new NoSuchElementException("해당 id를 가진 유저는 없습니다."); + } + userRepository.deleteById(userId); + + if (userStatusRepository.existsById(userId)) { + userStatusRepository.deleteById(userId); } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java deleted file mode 100644 index 0639e655..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.repository.DefaultChannelFactory; -import com.sprint.mission.discodeit.service.ChannelService; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class FileChannelService implements ChannelService { - - private Map channelMap; - private Channel currentChannel; - private final static String FILEPATH = "channels.ser"; - - public FileChannelService() { - channelMap = loadChannels(); - - if (channelMap == null || channelMap.isEmpty()) { - channelMap = new HashMap<>(); - List defaultChannels = DefaultChannelFactory.getChannel(); - for (Channel channel : defaultChannels) { - channelMap.put(channel.getChannelNumber(), channel); - } - saveChannels(); - } else { - int max = 0; - for (Channel channel : channelMap.values()) { - if (channel.getChannelNumber() > max) { - max = channel.getChannelNumber(); - } - } - Channel.setCounter(max + 1); - } - } - - @SuppressWarnings("unchecked") - private Map loadChannels() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; - } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (Map) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return null; - } - - private void saveChannels() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(channelMap); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void outputAllChannelInfo() { - for (Channel channel : channelMap.values()) { - System.out.println(channel); - } - } - - @Override - public void outputOneChannelInfo(Channel channel) { - if (channel == null) { - System.out.println("해당 채널은 존재하지 않습니다."); - } else { - System.out.println(channel); - } - } - - @Override - public void updateChannelName(Channel currentChannel, String newName) { - Channel channel = channelMap.get(currentChannel.getChannelNumber()); - if (channel != null) { - channel.updateChannel(newName); - saveChannels(); - } else { - System.out.println("해당 채널을 찾을 수 없습니다."); - } - } - - @Override - public void deleteChannelName(Channel currentChannel) { - Integer findChannelKey = null; - for (Map.Entry entry : channelMap.entrySet()) { - if (entry.getValue().getChannelNumber() == currentChannel.getChannelNumber()) { - findChannelKey = entry.getKey(); - break; - } - } - if (findChannelKey != null) { - channelMap.remove(findChannelKey); - saveChannels(); - } - } - - @Override - public void createNewChannel(String channelName) { - Channel channel = new Channel(channelName); - channelMap.put(channel.getChannelNumber(), channel); - saveChannels(); - } - - @Override - public Channel getChannelByNumber(int channelNumber) { - Channel newChannel = channelMap.get(channelNumber); - if (newChannel != null) { - currentChannel = newChannel; - } - return currentChannel; - } - - @Override - public void selectChannel(int channelNumber) { - Channel channel = channelMap.get(channelNumber); - if (channel != null) { - currentChannel = channel; - } else { - System.out.println("유효하지 않은 채널 번호입니다."); - } - } - - @Override - public Channel getCurrentChannel() { - return currentChannel; - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java deleted file mode 100644 index afc1bdd5..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.service.MessageService; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; - -public class FileMessageService implements MessageService { - - private List messages; - private final static String FILEPATH = "messages.ser"; - - public FileMessageService() { - messages = loadMessages(); - if (messages == null) { - messages = new ArrayList<>(); - } else { - int max = 0; - for (Message message : messages) { - if (message.getNumber() > max) { - max = message.getNumber(); - } - } - Message.setCounter(max + 1); - } - } - - @SuppressWarnings("unchecked") - private List loadMessages() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; - } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return null; - } - - private void saveMessages() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(messages); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public List inputMessage(String newMessage) { - Message newMsg = new Message(newMessage); - messages.add(newMsg); - saveMessages(); - return messages; - } - - @Override - public void outputUserMessage() { - if (messages.isEmpty()) { - System.out.println("메시지가 비었습니다."); - } else { - for (Message message1 : messages) { - System.out.println(message1); - } - } - } - - @Override - public void updateUserMessage(int number, String newMessage) { - messages.stream() - .filter(m -> m.getNumber() == number) - .findFirst() - .ifPresent(message1 -> message1.updateMessage(newMessage)); - saveMessages(); - } - - @Override - public void deleteUserMessage(int number) { - messages.stream() - .filter(message1 -> message1.getNumber() == number) - .findFirst() - .ifPresent(message1 -> messages.remove(message1)); - saveMessages(); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java deleted file mode 100644 index 30c69a89..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.UserService; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; -import java.util.UUID; - -public class FileUserService implements UserService { - - private List users; - private final String FILEPATH = "users.ser"; - private final Scanner sc = new Scanner(System.in); - - public FileUserService() { - users = loadUsers(); - if (users == null) { - users = new ArrayList<>(); - } else { - int max = 0; - for (User user : users) { - if (user.getNumber() > max) { - max = user.getNumber(); - } - } - User.setCounter(max + 1); - } - } - - - @SuppressWarnings("unchecked") //실행은 되는데 무슨 에러떠서 지피티한테 물어보고 추가했습니다 !! - private List loadUsers() { - File file = new File(FILEPATH); - if (!file.exists()) { - return null; - } - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) { - return (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return null; - } - - private void saveUsers() { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILEPATH))) { - oos.writeObject(users); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public User registerUser() { - System.out.println("안녕하세요. DisCodeit에 오신 걸 환영합니다. 사용자의 이름을 입력 해 주세요."); - String userName = sc.nextLine(); - User newUser = new User(userName); - users.add(newUser); - saveUsers(); - return newUser; - } - - @Override - public void createNewUserNames(String existingName, String newName) { - if (existingName.equals(newName.trim())) { - System.out.println("동일한 프로필은 생성할 수 없습니다."); - } else { - users.add(new User(newName)); - saveUsers(); - } - } - - @Override - public void outputAllUsersInfo() { - for (User user : users) { - System.out.println(user); - } - } - - @Override - public void outputOneUserInfo(UUID uuid) { - List userName = users - .stream() - .filter(e -> e.getId().equals(uuid)) - .toList(); - System.out.println(userName); - } - - @Override - public void updateUserName(User user, String newName) { - if (user.getUsername().equals(newName.trim())) { - System.out.println("프로필 이름은 중복 될 수 없습니다."); - } else { - users.stream() - .filter(user1 -> user1.getUsername().equals(user.getUsername())) - .findFirst() - .ifPresent(user1 -> user1.updateUserName(newName)); - saveUsers(); - } - } - - @Override - public void deleteUserName(int userNumber) { - users.stream() - .filter(user -> user.getNumber() == userNumber) - .findFirst() - .ifPresent(user -> users.remove(user)); - saveUsers(); - } - - @Override - public User changeUser(int userNumber) { - return users.stream() - .filter(user1 -> user1.getNumber() == userNumber) - .findFirst() - .orElse(null); - } - - @Override - public void login(int loginNumber) { - users.stream() - .filter(u -> u.getNumber() == loginNumber) - .findFirst() - .orElseThrow(() -> new RuntimeException("해당 번호의 유저가 존재하지 않습니다: ")); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java deleted file mode 100644 index f35c1a60..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.service.ChannelService; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class JCFChannelService implements ChannelService { - - private final Map channelMap; - private Channel currentChannel; - - public JCFChannelService(List channels) { - this.channelMap = new HashMap<>(); - for (Channel channel : channels) { - channelMap.put(channel.getChannelNumber(), channel); - } - } - - @Override - public void outputAllChannelInfo() { - for (Channel channel : channelMap.values()) { - System.out.println(channel); - } - } - - public void outputOneChannelInfo(Channel channel) { - if (channel == null) { - System.out.println("해당 채널은 존재하지 않습니다."); - } else { - System.out.println(channel); - } - } - - public void updateChannelName(Channel currentChannel, String newName) { - Channel channel = channelMap.get(currentChannel.getChannelNumber()); - if (channel != null) { - channel.updateChannel(newName); - } else { - System.out.println("해당 채널을 찾을 수 없습니다."); - } - } - - public void deleteChannelName(Channel currentChannel) { - Integer findChannelKey = null; - for (Map.Entry entry : channelMap.entrySet()) { - if (entry.getValue().getChannelNumber() == (currentChannel.getChannelNumber())) { - findChannelKey = entry.getKey(); - break; - } - } - if (findChannelKey != null) { - channelMap.remove(findChannelKey); - } - } - - public void createNewChannel(String channelName) { - Channel channel = new Channel(channelName); - channelMap.put(channel.getChannelNumber(), channel); - } - - - public Channel getChannelByNumber(int channelNumber) { - Channel newChannel = channelMap.get(channelNumber); - if (newChannel != null) { - currentChannel = newChannel; - } - return currentChannel; - } - - public void selectChannel(int channelNumber) { - Channel channel = channelMap.get(channelNumber); - if (channel != null) { - currentChannel = channel; - } else { - System.out.println("유효하지 않은 채널 번호입니다."); - } - } - - public Channel getCurrentChannel() { - return currentChannel; - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java deleted file mode 100644 index 0c59ffc7..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.service.MessageService; -import java.util.ArrayList; -import java.util.List; - -public class JCFMessageService implements MessageService { - private final List messages = new ArrayList<>(); - - public List inputMessage(String newMessage) { - Message newMsg = new Message(newMessage); - messages.add(newMsg); - return messages; - } - - public void outputUserMessage() { - if (messages.isEmpty()) { - System.out.println("메시지가 비었습니다."); - } else { - for (Message message1 : messages) { - System.out.println(message1); - } - } - - } - - public void updateUserMessage(int number, String newMessage) { - messages.stream() - .filter(message1 -> message1.getNumber() == number) - .findFirst() - .ifPresent(message1 -> message1.updateMessage(newMessage)); - } - - public void deleteUserMessage(int number) { - messages.stream() - .filter(message1 -> message1.getNumber() == number) - .findFirst() - .ifPresent(message1 -> messages.remove(message1)); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java deleted file mode 100644 index f87b077c..00000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.UserService; -import java.util.List; -import java.util.Scanner; -import java.util.UUID; - -public class JCFUserService implements UserService { - - private final List users; - - public JCFUserService(List users) { - this.users = users; - } - - - public User registerUser() { - Scanner sc = new Scanner(System.in); - System.out.println("안녕하세요. DisCodeit에 오신 걸 환영합니다. 사용자의 이름을 입력 해 주세요."); - String userName = sc.nextLine(); - return new User(userName); - } - - @Override - public void createNewUserNames(String existingName, String newName) { - if (existingName.equals(newName.trim())) { - System.out.println("동일한 프로필은 생성할 수 없습니다."); - } else { - users.add(new User(newName)); - } - } - - public void outputAllUsersInfo() { - for (User user : users) { - System.out.println(user); - } - } - - public void outputOneUserInfo(UUID uuid) { - List userName = users - .stream() - .filter(e -> e.getId().equals(uuid)) - .toList(); - System.out.println(userName); - } - - public void updateUserName(User user, String newName) { - if (user.getUsername().equals(newName.trim())) { - System.out.println("프로필 이름은 중복 될 수 없습니다."); - } else { - users.stream() - .filter(user1 -> user1.getUsername().equals(user.getUsername())) - .findFirst() - .ifPresent(user1 -> user1.updateUserName(newName)); - } - - } - - public void deleteUserName(int userNumber) { - users.stream() - .filter(user -> user.getNumber() == userNumber) - .findFirst() - .ifPresent(user -> users.remove(user)); - } - - public User changeUser(int userNumber) { - return users.stream().filter(user1 -> user1.getNumber() == userNumber).findFirst().orElse(null); - } - - public void login(int loginNumber) { - users.stream() - .filter(user -> user.getNumber() == loginNumber) - .findFirst() - .orElseThrow(() -> new RuntimeException("해당 번호의 유저가 존재하지 않습니다: ")); - } - - -} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 00000000..2d292a73 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,4 @@ +discodeit: + repository: + type: file # 또는 file + file-directory: .discodeit \ No newline at end of file diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java new file mode 100644 index 00000000..3a987a21 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DiscodeitApplicationTests { + + @Test + void contextLoads() { + } + +}