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 de9480dd..c2065bc2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,11 @@ +HELP.md .gradle -.idea/ 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 @@ -29,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/ @@ -38,6 +35,3 @@ bin/ ### VS Code ### .vscode/ - -### Mac OS ### -.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle index 668101a2..76c6bfe1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,37 @@ 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-validation' + 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 e754b315..37f853b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Wed Apr 02 19:08:37 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 100644 --- 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 107acd32..9d21a218 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,10 @@ @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 +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +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 @@ -56,11 +59,11 @@ 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. +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 @@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +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! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +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 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/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java new file mode 100644 index 00000000..3e70c2e7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -0,0 +1,476 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.config.DiscodeitProperties; +import com.sprint.mission.discodeit.dto.Response.ChannelResponse; +import com.sprint.mission.discodeit.dto.Response.MessageResponse; +import com.sprint.mission.discodeit.dto.Response.UserResponse; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_private; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_public; +import com.sprint.mission.discodeit.dto.request.create.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.create.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.ChannelUpdateRequest; +import com.sprint.mission.discodeit.dto.request.update.MessageUpdateRequest; +import com.sprint.mission.discodeit.dto.request.update.UserUpdateRequest; +import com.sprint.mission.discodeit.entity.User; +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.util.DataInitializer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ConfigurableApplicationContext; + +import java.util.*; +import java.util.stream.Collectors; + +@SpringBootApplication +@EnableConfigurationProperties(DiscodeitProperties.class) +public class DiscodeitApplication { + + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); + //초기화 + DataInitializer initializer = context.getBean(DataInitializer.class); + initializer.clearSerializedData(); + + context.close(); + context = SpringApplication.run(DiscodeitApplication.class, args); + + //콩받기 + UserService userService = context.getBean(UserService.class); + ChannelService channelService = context.getBean(ChannelService.class); + MessageService messageService = context.getBean(MessageService.class); + + + List users = createAndRegisterUsers(userService); + List channels = createAndRegisterChannels(channelService, users); + List messages = createAndRegisterMessages(messageService, users, channels); + + demonstrateUserOperations(userService, users); + demonstrateChannelOperations(channelService, channels, users); + demonstrateMessageOperations(messageService, messages, channels); + + } + + //유저생성 및 등록 + private static List createAndRegisterUsers(UserService userService) { + List users = List.of( + new UserCreateRequest("조현아", "akbkck8101@gmail.com", "010-6658-8101", "2701",null,null), + new UserCreateRequest("신짱구", "zzang9@gmail.com", "010-1234-5678", "9999",null,null), + new UserCreateRequest("김철슈", "steelwater@naver.com", "010-0000-0000", "steelwater", null,null), + new UserCreateRequest("이훈이", "2hun2@naver.com", "010-2345-6789", "2hun222",null,null), + new UserCreateRequest("맹구", "stone_lover9@gmail.com", "010-1010-0101", "stone_lover",null,null), + new UserCreateRequest("한유리", "yuryyy@gmail.com", "010-1111-2222", "12345",null,null), + new UserCreateRequest("한유리", "yuryyy@gmail.com", "010-1111-2222", "12345",null,null) //중복 이메일 유저_ex) + ); + + System.out.println("<--------------------유저를 등록합니다------------------------->\n.\n."); + + List registeredUsers = users.stream() + .map(user -> { + try { + UserResponse response = userService.create(user); + System.out.println("유저 등록 완료: " + user.name()); + return response; + } catch (IllegalArgumentException e) { + System.out.println("!!유저 등록 실패!! " + e.getMessage()); + return null; + } + }) + .filter(Objects::nonNull) + .toList(); + + System.out.println(".\n.\n<--------------------유저 등록 종료---------------------------->\n"); + return registeredUsers; + } + + //채널,멤버,카테고리 생성 및 등록 + private static List createAndRegisterChannels(ChannelService channelService, List users) { + //채널1 멤버, 카테고리생성 + Set members1 = Set.of(users.get(0).id(), users.get(1).id(), users.get(3).id()); + List cat1 = List.of("공지", "질문", "2팀"); + + Set members2 = Set.of(users.get(1).id(), users.get(2).id(), users.get(4).id()); + List cat2 = List.of("이벤트", "소통"); + + Set members3 = Set.of(users.get(5).id()); + List cat3 = List.of("기타"); + + //중복 카테고리 + List cat5 = List.of("공지","공지"); + + List> channelConfigs = List.of( + Map.of("name", "sp01", "creator", users.get(1), "categories", cat1, "members", members1, "isPrivate", false), + Map.of("name", "sp02", "creator", users.get(1), "categories", cat2, "members", members2, "isPrivate", false), + Map.of("name", "sp03", "creator", users.get(5), "categories", cat3, "members", members3, "isPrivate", false), + Map.of("name", "sp03", "creator", users.get(5), "categories", cat3, "members", members3, "isPrivate", false), + Map.of("name", "sp05", "creator", users.get(5), "categories", cat5, "members", members3, "isPrivate", false), + Map.of("name", "", "creator", users.get(5), "categories", new ArrayList<>(), "members", members3, "isPrivate", true), + Map.of("name", "", "creator", users.get(5), "categories", new ArrayList<>(), "members", members3, "isPrivate", true) + ); + + System.out.println("<--------------------채널을 등록합니다------------------------->\n.\n."); + List registeredChannels = new ArrayList<>(); + + for (Map channelConfig : channelConfigs) { + String name = (String) channelConfig.get("name"); + UserResponse creator = (UserResponse) channelConfig.get("creator"); + List categories = (List) channelConfig.get("categories"); + Set members = (Set) channelConfig.get("members"); + boolean isPrivate = (boolean) channelConfig.get("isPrivate"); + + try { + ChannelResponse response; + if (isPrivate) { + // PRIVATE 채널은 이름/카테고리 없이 생성 + var request = new ChannelCreateRequest_private(creator.id(), members); + response = channelService.createPrivateChannel(request); + } else { + var request = new ChannelCreateRequest_public(name, creator.id(), categories, members); + response = channelService.createPublicChannel(request); + } + + registeredChannels.add(response); + if(isPrivate){ + System.out.println("Private 채널 등록 완료"); + } else System.out.println("채널 등록 완료: " + name); + // 실제 저장된 채널을 찾아서 registeredChannels에 추가하려면 Repository에서 다시 조회 필요 + } catch (IllegalArgumentException e) { + System.out.println("!!채널 등록 실패!! " + name + ": " + e.getMessage()); + } + } + + System.out.println(".\n.\n<--------------------채널 등록 종료---------------------------->\n"); + return registeredChannels; + } + + //메시지 생성 및 등록 + private static List createAndRegisterMessages(MessageService messageService, List users, List channels) { + List messages = List.of( + new MessageCreateRequest(users.get(0).id(), channels.get(0).channelId(), "공지", "공지입니다.",null), + new MessageCreateRequest(users.get(1).id(), channels.get(0).channelId(), "2팀", "안녕하세요.",null), + new MessageCreateRequest(users.get(4).id(), channels.get(1).channelId(), "소통", "소통해요",null), + new MessageCreateRequest(users.get(2).id(), channels.get(1).channelId(), "소통", "좋아요",null), + new MessageCreateRequest(users.get(5).id(), channels.get(1).channelId(), "소통", "hi",null), //채널 멤버가 아닌 유저 + new MessageCreateRequest(users.get(0).id(), channels.get(0).channelId(), "공자", "hi",null) //채널에 없는 카테고리 + ); + + System.out.println("<--------------------메시지를 저장합니다----------------------->\n.\n."); + + Map channelIdToName = channels.stream() + .collect(Collectors.toMap(ChannelResponse::channelId, ChannelResponse::channelName)); + + List registeredMessages = messages.stream() + .map(request -> { + try { + MessageResponse response = messageService.create(request); + System.out.println("[" + channelIdToName.get(request.channelId()) + "] 채널에 메시지 등록 완료"); + return response; + } catch (IllegalArgumentException e) { + System.out.println("!!메시지 등록 실패!! " + e.getMessage()); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + System.out.println(".\n.\n<--------------------메시지 저장 종료-------------------------->\n"); + return registeredMessages; + } + + + private static void demonstrateUserOperations(UserService userService, List users){ + System.out.println("\n########################### User ###############################"); + + findUser(userService, users); + updateUser(userService, users); + deleteUser(userService, users); + + } + + private static void findUser(UserService userService, List users){ + System.out.println("------------------------- ReadUser -----------------------------"); + //전체 유저조회(다건 조회) + System.out.println("\n전체 유저 목록: "); + userService.findAll().forEach(System.out::println); + + //특정 유저조회(단건 조회, 이름) + System.out.println("\n신짱구 유저 조회(이름으로 검색): "); + System.out.println(userService.findByUserName("신짱구")); + + //특정 유저조회(단건 조회, id) + System.out.println("\n이훈이 유저 조회(id로 검색): "); + System.out.println(userService.find(users.get(3).id()).toString()); + + //이름에 "구"가 포함된 유저 + System.out.println("\n이름에 '구'가 포함된 유저('구'로 검색): "); + System.out.println(userService.findByUserNameKeyWords("구")); + } + private static void updateUser(UserService userService, List users){ + System.out.println("\n------------------------- UpdateUser ---------------------------"); + //유저 수정 테스트 + System.out.println("\n유저 수정하기\n수정 전: "); + + //수정하려는 유저 original에 저장 + UserResponse original = users.get(2); + System.out.println(userService.find(original.id())); + + //수정한 유저정보 updated에 저장 + UserResponse updated = userService.update( new UserUpdateRequest(original.id(),"김철수", original.email(), "010-0011-0011", original.password(), null)); + System.out.println("수정 후(이름, 번호): "); + System.out.println(userService.find(updated.id())); + } + private static void deleteUser(UserService userService, List users){ + System.out.println("\n------------------------ DeleteUser ----------------------------"); + System.out.println("\n전체 유저 목록: "); + userService.findAll().forEach(System.out::println); + + //유저 삭제 실패 + System.out.println("\n"+ users.get(3).userName() +" 유저 탈퇴 진행중..\n.\n.\n"); + userService.delete(users.get(3).id(),"0000"); + + //유저 삭제 성공 + System.out.println("\n"+ users.get(3).userName() +"유저 탈퇴 진행중..\n.\n.\n"); + userService.delete(users.get(3).id(),"2hun222"); + + //삭제 후 전체 유저 조회 + System.out.println("\n\n전체 유저 목록: "); + userService.findAll().forEach(System.out::println); + System.out.println(); + } + + private static void demonstrateChannelOperations(ChannelService channelService, List channels, List users) { + System.out.println("\n########################### Channel ############################"); + + findChannel(channelService, users); + updateChannel(channelService,channels,users); + deleteChannel(channelService,channels,users); + } + + private static void findChannel(ChannelService channelService, List users){ + System.out.println("------------------------- findChannel --------------------------"); + System.out.println("\n전체 채널 목록"); + + //신짱구 유저가 있는 채널 조회 + UUID userId = users.get(1).id(); + List userChannels = channelService.findAllByUserId(userId); + + if (userChannels.isEmpty()) { + System.out.println("조회할 채널이 없습니다."); + } else { + userChannels.forEach(channel -> System.out.println("[" + channel.channelName() + "]")); + } + + //특정 채널 정보 + try { + ChannelResponse channel = channelService.find(userChannels.get(0).channelId()); + System.out.println("\n채널명: " + channel.channelName()); + System.out.println("카테고리: " + channel.categories()); + + } catch (IllegalArgumentException e) { + System.out.println("!!채널 조회 실패!! " + e.getMessage()); + } + + + //조회 위해 private채널 별도 저장 + Set members = Set.of(users.get(1).id(), users.get(2).id(), users.get(5).id()); + + ChannelResponse privateChannel = channelService.createPrivateChannel( + new ChannelCreateRequest_private(users.get(5).id(), members)); + + //private 채널 조회 + try { + System.out.println("\nPrivate 채널 조회"); + ChannelResponse channel = channelService.find(privateChannel.channelId()); + System.out.println(channel); + + } catch (IllegalArgumentException e) { + System.out.println("!!채널 조회 실패!! " + e.getMessage()); + } + + //sp01채널 멤버조회 + System.out.println("\n[sp01]채널 멤버 조회"); + ChannelResponse sp01 = userChannels.stream() + .filter(c -> "sp01".equals(c.channelName())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[sp01]채널을 찾을 수 없습니다.")); + + for (User member : channelService.members(sp01.channelId())) { + System.out.print(member.getName() + " "); + } + + System.out.println(); + } + private static void updateChannel(ChannelService channelService, List channels, List users){ + System.out.println("\n------------------------- UpdateChannel -----------------------"); + + //채널 수정 + ChannelResponse original = channels.get(2); //수정하려는 채널 + + System.out.println("\n["+ original.channelName() +"] 채널 수정 진행중\n.\n.\n."); + System.out.println("수정 전: " + channelService.find(original.channelId())); + + //수정한 채널 updated에 저장, 출력(채널명 수정) + try { + ChannelUpdateRequest updatedChannel1 = new ChannelUpdateRequest( + original.channelId(), "변경sp03", original.categories(), original.creatorId()); + ChannelResponse success_updatedChannel1 = channelService.update(updatedChannel1); + System.out.println("수정 후: " + success_updatedChannel1); + } catch (IllegalArgumentException e) { + System.out.println("!!채널 수정 실패!! " + e.getMessage()); + } + + //수정한 채널 updated에 저장, 출력(방장 변경 + member에 추가) + System.out.println("\n["+ original.channelName() +"] 채널 수정 진행중\n.\n.\n."); + System.out.println("\n["+ original.channelName() +"] 수정 완료(새 유저로 방장 변경): "); + System.out.println("수정 전: " + channelService.find(original.channelId())); + + try { + ChannelUpdateRequest updatedChannel2 = new ChannelUpdateRequest( + original.channelId(), original.channelName(), original.categories(), users.get(1).id()); + ChannelResponse success_updatedChannel2 = channelService.update(updatedChannel2); + System.out.println("방장 변경 후: " + success_updatedChannel2); + } catch (IllegalArgumentException e) { + System.out.println("!!방장 변경 실패!! " + e.getMessage()); + } + + //기존 유저에서 방장변경 + //채널1에서 변경 + original = channels.get(0); + System.out.println("\n["+ original.channelName() +"] 채널 수정 진행중\n.\n.\n."); + System.out.println("\n["+ original.channelName() +"] 수정 완료(기존 유저로 방장 변경): "); + System.out.println("수정 전: " + channelService.find(original.channelId())); + + try { + ChannelUpdateRequest updatedChannel3 = new ChannelUpdateRequest( + original.channelId(), original.channelName(), original.categories(), users.get(0).id()); + ChannelResponse success_updatedChannel3 = channelService.update(updatedChannel3); + System.out.println("수정 후: " + success_updatedChannel3); + } catch (IllegalArgumentException e) { + System.out.println("!!채널 수정 실패!! " + e.getMessage()); + } + } + private static void deleteChannel(ChannelService channelService, List channels, List users){ + System.out.println("\n------------------------ DeleteChannel ------------------------"); + + //삭제 시도할 유저 + UUID userId = users.get(1).id(); + + System.out.print("\n전체 채널 목록: \n"); + channelService.findAllByUserId(userId).forEach(System.out::println); + + //채널 삭제 실패 + System.out.println("\n["+ channels.get(2).channelName() + "] 채널 삭제 진행중..\n.\n.\n"); + try { + channelService.delete(channels.get(2).channelId(), userId, "0000"); // 비밀번호가 다를 수 있음 + System.out.println("삭제 성공!"); + } catch (IllegalArgumentException e) { + System.out.println("삭제 실패: " + e.getMessage()); // → 비밀번호 불일치로 삭제 실패 + } + + //채널 삭제 성공 + System.out.println("\n["+ channels.get(2).channelName()+"] 채널 삭제 진행중..\n.\n.\n"); + try { + channelService.delete(channels.get(2).channelId(), userId, "9999"); // 비밀번호가 다를 수 있음 + System.out.println("삭제 성공!"); + } catch (IllegalArgumentException e) { + System.out.println("삭제 실패: " + e.getMessage()); // → 비밀번호 불일치로 삭제 실패 + } + + //삭제 후 전체 유저 조회 + System.out.print("\n전체 채널 목록: \n"); + channelService.findAllByUserId(userId).forEach(System.out::println); + } + + private static void demonstrateMessageOperations(MessageService messageService, List messages, List channels) { + System.out.println("\n########################### Message ###########################"); + + findMessages(messageService, channels); + updateMessages(messageService, messages, channels); + deleteMessages(messageService, messages, channels); + } + + private static void findMessages(MessageService messageService, List channels) { + System.out.println("------------------------- ReadMessage -------------------------"); + //메시지 전체조회(다건 조회) + System.out.println("\n전체 메시지"); + messageService.findAllByChannelId(channels.get(0).channelId()).forEach(System.out::println); + + //메시지3 조회(단건 조회) + try{ + UUID messageId = messageService.findAllByChannelId(channels.get(0).channelId()).get(0).id(); + System.out.println("\n메시지 조회"); + System.out.println(messageService.find(messageId)); + + } catch (IllegalArgumentException e) { + System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); + + } + + //존재하지 않는 메시지 조회 + try{ + System.out.println("\n존재하지 않는 메시지 조회"); + System.out.println(messageService.find(UUID.randomUUID())); + } catch (IllegalArgumentException e) { + System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); + } + } + private static void updateMessages(MessageService messageService, List messages, List channels) { + System.out.println("\n------------------------- UpdateMessage ------------------------"); + + //수정할 메시지 original변수에 저장 + MessageResponse original = messages.get(0); + System.out.println("\n메시지1 수정 전: \n" + messageService.find(original.id())); + + //변경 메시지 updated변수에 저장 + MessageUpdateRequest updateRequest = new MessageUpdateRequest( + original.id(), "공지 수정합니다~~~~"); + + //메시지 수정 + MessageResponse updated = messageService.update(updateRequest); + System.out.println("\n메시지1 수정 후: \n" + updated); + + //수정후 전체 메시지 + System.out.println("\n["+ channels.get(0).channelName() +"]의 전체 메시지"); + messageService.findAllByChannelId(channels.get(0).channelId()).forEach(System.out::println); + } + private static void deleteMessages(MessageService messageService, List messages, List channels) { + System.out.println("\n------------------------ DeleteMessage ------------------------"); + //메시지 삭제 + MessageResponse original = messages.get(3); + UUID targetChannelId = channels.get(1).channelId(); + + System.out.println("[sp02]채널의 메시지 조회"); + try { + messageService.findAllByChannelId(targetChannelId).forEach(System.out::println); + } catch (Exception e) { + System.out.println("삭제 전 메시지 조회 실패: " + e.getMessage()); + } + + try{ + messageService.delete(original.id()); + System.out.println("\n.\n.\n<<[sp02]의 메시지 삭제 완료>>\n"); + } catch (IllegalArgumentException e) { + System.out.println("\n!!메시지 삭제 실패!!" + e.getMessage()); + } + + //메시지 삭제 후 재조회 + System.out.print("삭제 후 전체 메시지: \n"); + for (ChannelResponse channel : channels) { + String channelName = channel.channelName(); + + try { + if(channelName == null || channelName.isBlank()) { + System.out.println("\nPrivate 채널입니다."); + } else { + System.out.println("\n[" + channel.channelName() + "]의 메시지"); + messageService.findAllByChannelId(channel.channelId()).forEach(System.out::println); + } + } catch (IllegalArgumentException | NoSuchElementException e) { + System.out.println("메시지가 없거나 조회할 수 없습니다. " + e.getMessage()); + } + } + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index c513e767..19b1751b 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -1,367 +1,367 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.factory.ServiceFactory; -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.util.DataInitializer; - -import java.util.*; -import java.util.stream.Collectors; - -public class JavaApplication { - public static void main(String[] args) { - //초기화 - DataInitializer.clearSerializedData(); - - ServiceFactory serviceFactory = ServiceFactory.getInstance(); - - ChannelService channelService = serviceFactory.createChannelService(); - UserService userService = serviceFactory.createUserService(); - MessageService messageService = serviceFactory.createMessageService(); - - - List users = createAndRegisterUsers(userService); - List channels = createAndRegisterChannels(channelService, users); - List messages = createAndRegisterMessages(messageService, users, channels); - - demonstrateUserOperations(userService, users); - demonstrateChannelOperations(channelService, channels,users); - demonstrateMessageOperations(messageService); - - } - - //유저생성 및 등록 - private static List createAndRegisterUsers(UserService userService) { - List users = List.of( - new User("조현아", "여", "akbkck8101@gmail.com", "010-6658-8101", "2701"), - new User("신짱구", "남", "zzang9@gmail.com", "010-1234-5678", "9999"), - new User("김철슈", "남", "steelwater@naver.com", "010-0000-0000", "steelwater"), - new User("이훈이", "남", "2hun2@naver.com", "010-2345-6789", "2hun222"), - new User("맹구", "남", "stone_lover9@gmail.com", "010-1010-0101", "stone_lover"), - new User("한유리", "여", "yuryyy@gmail.com", "010-1111-2222", "12345"), - new User("한유리", "여", "yuryyy@gmail.com", "010-1111-2222", "12345") //중복 이메일 유저_ex) - ); - - System.out.println("<--------------------유저를 등록합니다------------------------->\n.\n."); - - List registeredUsers = users.stream() - .filter(user -> { - try { - userService.create(user); - System.out.println("유저 등록 완료: " + user.getName()); - return true; - } catch (IllegalArgumentException e) { - System.out.println("!!유저 등록 실패!! " + e.getMessage()); - return false; - } - }) - .toList(); - - System.out.println(".\n.\n<--------------------유저 등록 종료---------------------------->\n"); - return registeredUsers; - } - - //채널,멤버,카테고리 생성 및 등록 - private static List createAndRegisterChannels(ChannelService channelService, List users) { - //채널1 멤버, 카테고리생성 - Set members1 = new HashSet<>(Set.of(users.get(0), users.get(1), users.get(3))); - List cat1 = List.of("공지", "질문", "2팀"); - - Set members2 = new HashSet<>(Set.of(users.get(1), users.get(2), users.get(4))); - List cat2 = List.of("이벤트", "소통"); - - Set members3 = new HashSet<>(Set.of(users.get(5))); - List cat3 = List.of("기타"); - - //중복 카테고리 - List cat5 = List.of("공지","공지"); - - List channels = List.of( - new Channel("sp01", users.get(1), cat1, members1), - new Channel("sp02", users.get(1), cat2, members2), - new Channel("sp03", users.get(5), cat3, members3), - new Channel("sp03", users.get(5), cat3, members3), //중복 채널명_ex) - new Channel("sp05", users.get(5), cat5, members3) //중복 카테고리_ex) - ); - - System.out.println("<--------------------채널을 등록합니다------------------------->\n.\n."); - - List registeredChannels = channels.stream() - .filter(channel -> { - try { - channelService.create(channel); - System.out.println("채널 등록 완료: " + channel.getChannelName()); - return true; - } catch (IllegalArgumentException e) { - System.out.println("!!채널 등록 실패!! " + e.getMessage()); - return false; - } - }) - .toList(); // 성공한 채널만 리스트로 변환 - - System.out.println(".\n.\n<--------------------채널 등록 종료---------------------------->\n"); - return registeredChannels; - } - - //메시지 생성 및 등록 - private static List createAndRegisterMessages(MessageService messageService, List users, List channels) { - List messages = List.of( - new Message(users.get(0), channels.get(0), "공지", "공지입니다."), - new Message(users.get(1), channels.get(0), "2팀", "안녕하세요."), - new Message(users.get(4), channels.get(1), "소통", "소통해요"), - new Message(users.get(2), channels.get(1), "소통", "좋아요"), - new Message(users.get(5), channels.get(1), "소통", "hi"), //채널 멤버가 아닌 유저 - new Message(users.get(0), channels.get(0), "공자", "hi") //채널에 없는 카테고리 - ); - - System.out.println("<--------------------메시지를 저장합니다----------------------->\n.\n."); - - List registeredMessages = messages.stream() - .map(message -> { - try { - messageService.create(message); - System.out.println("[" + message.getChannel().getChannelName() + "] 채널에 메시지 등록 완료"); - return message; - } catch (IllegalArgumentException e) { - System.out.println("!!메시지 등록 실패!! " + e.getMessage()); - return null; - } - }) - .filter(Objects::nonNull) // null 제거 (등록 실패한 메시지 필터링) - .collect(Collectors.toList()); - - System.out.println(".\n.\n<--------------------메시지 저장 종료-------------------------->\n"); - return registeredMessages; - } - - - private static void demonstrateUserOperations(UserService userService, List users){ - System.out.println("\n########################### User ###############################"); - - readUser(userService, users); - updateUser(userService, users); - deleteUser(userService, users); - - } - - private static void readUser(UserService userService, List users){ - System.out.println("------------------------- ReadUser -----------------------------"); - //전체 유저조회(다건 조회) - System.out.println("\n전체 유저 목록: "); - userService.readAll().forEach(System.out::println); - - //특정 유저조회(단건 조회, 이름) - System.out.println("\n신짱구 유저 조회(이름으로 검색): "); - userService.readByName("신짱구").forEach(System.out::println); - - //특정 유저조회(단건 조회, id) - System.out.println("\n이훈이 유저 조회(id로 검색): "); - System.out.println(userService.read(users.get(3).getId()).toString()); - - //이름에 "구"가 포함된 유저 - System.out.println("\n이름에 '구'가 포함된 유저('구'로 검색): "); - userService.readByName("구").forEach(System.out::println); - } - private static void updateUser(UserService userService, List users){ - System.out.println("\n------------------------- UpdateUser ---------------------------"); - //유저 수정 테스트 - System.out.println("\n유저 수정하기\n수정 전: "); - - //수정하려는 유저 original에 저장 - User original = users.get(2); - System.out.println(userService.read(original.getId())); - - //수정한 유저정보 updated에 저장 - User updated = userService.update(original.getId(), new User("김철수", original.getGender(), original.getEmail(), "010-0011-0011", original.getPassword())); - System.out.println("수정 후(이름, 번호): "); - System.out.println(userService.read(updated.getId())); - } - private static void deleteUser(UserService userService, List users){ - System.out.println("\n------------------------ DeleteUser ----------------------------"); - System.out.println("\n전체 유저 목록: "); - userService.readAll().forEach(System.out::println); - - //유저 삭제 실패 - System.out.println("\n"+ users.get(3).getName() +" 유저 탈퇴 진행중..\n.\n.\n"); - userService.delete(users.get(3).getId(),"0000"); - - //유저 삭제 성공 - System.out.println("\n"+ users.get(3).getName() +"유저 탈퇴 진행중..\n.\n.\n"); - userService.delete(users.get(3).getId(),"2hun222"); - - //삭제 후 전체 유저 조회 - System.out.println("\n\n전체 유저 목록: "); - userService.readAll().forEach(System.out::println); - System.out.println(); - } - - private static void demonstrateChannelOperations(ChannelService channelService, List channels, List users) { - System.out.println("\n########################### Channel ############################"); - - readChannel(channelService,channels,users); - updateChannel(channelService,channels,users); - deleteChannel(channelService,channels,users); - } - - private static void readChannel(ChannelService channelService, List channels, List users){ - System.out.println("------------------------- ReadChannel --------------------------"); - System.out.println("\n전체 채널 목록"); - - if (channelService.readAll().isEmpty()) { - System.out.println("조회할 채널이 없습니다."); - } else { - channels.forEach(channel -> System.out.println("[" + channel.getChannelName() + "]")); - } - - - //특정 채널 정보 - try { - Channel channel = channelService.read(channels.get(0).getId()); - System.out.println("\n채널명: " + channel.getChannelName()); - System.out.println("카테고리: " + channel.getCategory()); - - } catch (IllegalArgumentException e) { - System.out.println("!!채널 조회 실패!! " + e.getMessage()); - } - - //채널 멤버조회 - try { - System.out.print("\n[sp01] 채널 멤버: "); - for (User member : channelService.members(channels.get(0).getId())) { - System.out.print(member.getName() + " "); - } - } catch (IllegalArgumentException e) { - System.out.println("!!채널 조회 실패!! " + e.getMessage()); - } - System.out.println(); - } - private static void updateChannel(ChannelService channelService, List channels, List users){ - System.out.println("\n------------------------- UpdateChannel -----------------------"); - - //채널 수정 - Channel original = channels.get(2); //수정하려는 채널 - - System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); - System.out.println("\n["+ original.getChannelName() +"] 수정 완료(채널 이름): "); - System.out.println("수정 전: " + channelService.read(original.getId())); - - //수정한 채널 updated에 저장, 출력(채널명 수정) - try { - Channel updatedChannel = channelService.update(original.getId(), new Channel("변경sp03", original.getKeyUser(),original.getCategory(), original.getMembers())); - System.out.println("수정 후: " + channelService.read(updatedChannel.getId())); - } catch (IllegalArgumentException e) { - System.out.println("!!채널 수정 실패!! " + e.getMessage()); - } - - //수정한 채널 updated에 저장, 출력(방장 변경 + member에 추가) - System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); - System.out.println("\n["+ original.getChannelName() +"] 수정 완료(새 유저로 방장 변경): "); - System.out.println("수정 전: " + channelService.read(original.getId())); - - try { - Channel updatedChannel = channelService.update(original.getId(), new Channel(original.getChannelName(), users.get(1), original.getCategory(), original.getMembers())); - System.out.println("수정 후: " + channelService.read(updatedChannel.getId())); - } catch (IllegalArgumentException e) { - System.out.println("!!채널 수정 실패!! " + e.getMessage()); - } - - //기존 유저에서 방장변경 - //채널1에서 변경 - original = channels.get(0); - System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); - System.out.println("\n["+ original.getChannelName() +"] 수정 완료(기존 유저로 방장 변경): "); - System.out.println("수정 전: " + channelService.read(original.getId())); - - try { - Channel updatedChannel = channelService.update(original.getId(), new Channel(original.getChannelName(), users.get(0), original.getCategory(), original.getMembers())); - System.out.println("수정 후: " + channelService.read(updatedChannel.getId())); - } catch (IllegalArgumentException e) { - System.out.println("!!채널 수정 실패!! " + e.getMessage()); - } - - } - private static void deleteChannel(ChannelService channelService, List channels, List users){ - System.out.println("\n------------------------ DeleteChannel ------------------------"); - - System.out.print("\n전체 채널 목록: \n"); - channelService.readAll().forEach(System.out::println); - - //채널 삭제 실패 - System.out.println("\n["+ channels.get(2).getChannelName() +"] 채널 삭제 진행중..\n.\n.\n"); - channelService.delete(channels.get(2).getId(), users.get(1), "0000"); - - //채널 삭제 성공 - System.out.println("\n["+ channels.get(2).getChannelName() +"] 채널 삭제 진행중..\n.\n.\n"); - channelService.delete(channels.get(2).getId(), users.get(1), "9999"); - - //삭제 후 전체 유저 조회 - System.out.print("\n전체 채널 목록: \n"); - channelService.readAll().forEach(System.out::println); - - } - - private static void demonstrateMessageOperations(MessageService messageService) { - System.out.println("\n########################### Message ###########################"); - - readMessages(messageService); - updateMessages(messageService); - deleteMessages(messageService); - } - - private static void readMessages(MessageService messageService) { - System.out.println("------------------------- ReadMessage -------------------------"); - //메시지 전체조회(다건 조회) - System.out.println("\n전체 메시지"); - messageService.readAll().forEach(System.out::println); - - //메시지3 조회(단건 조회) - try{ - System.out.println("\n메시지 조회"); - System.out.println(messageService.read(messageService.readAll().get(2).getId())); - - } catch (IllegalArgumentException e) { - System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); - - } - - //존재하지 않는 메시지 조회 - try{ - System.out.println("\n메시지 조회"); - System.out.println(messageService.read(UUID.randomUUID())); - } catch (IllegalArgumentException e) { - System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); - } - } - private static void updateMessages(MessageService messageService) { - System.out.println("\n------------------------- UpdateMessage ------------------------"); - //수정할 메시지 original변수에 저장 - Message original = messageService.read(messageService.readAll().get(0).getId()); - System.out.println("\n메시지1 수정 전: \n" + messageService.read(original.getId())); - - //변경 메시지 updated변수에 저장 - Message updated = new Message(original.getSender(), original.getChannel(), original.getCategory(), "공지 수정합니다~~~~"); - - //메시지 수정 - messageService.update(original.getId(), updated); - System.out.println("\n메시지1 수정 후: \n" + messageService.read(original.getId())); - - //수정후 전체 메시지 - System.out.println("\n전체 메시지"); - messageService.readAll().forEach(System.out::println); - } - private static void deleteMessages(MessageService messageService) { - System.out.println("\n------------------------ DeleteMessage ------------------------"); - //메시지 삭제 - System.out.println("\n.\n.\n<<메시지4 삭제 완료>>\n"); - messageService.delete(messageService.readAll().get(3).getId()); - - //메시지 삭제 후 재조회 - System.out.print("삭제 후 전체 메시지: \n"); - messageService.readAll().forEach(System.out::println); - } - -} +//package com.sprint.mission.discodeit; +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.Message; +//import com.sprint.mission.discodeit.entity.User; +//import com.sprint.mission.discodeit.factory.ServiceFactory; +//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.util.DataInitializer; +// +//import java.util.*; +//import java.util.stream.Collectors; +// +//public class JavaApplication { +// public static void main(String[] args) { +// //초기화 +// DataInitializer.clearSerializedData(); +// +// ServiceFactory serviceFactory = ServiceFactory.getInstance(); +// +// ChannelService channelService = serviceFactory.createChannelService(); +// UserService userService = serviceFactory.createUserService(); +// MessageService messageService = serviceFactory.createMessageService(); +// +// +// List users = createAndRegisterUsers(userService); +// List channels = createAndRegisterChannels(channelService, users); +// List messages = createAndRegisterMessages(messageService, users, channels); +// +// demonstrateUserOperations(userService, users); +// demonstrateChannelOperations(channelService, channels,users); +// demonstrateMessageOperations(messageService); +// +// } +// +// //유저생성 및 등록 +// private static List createAndRegisterUsers(UserService userService) { +// List users = List.of( +// new User("조현아", "여", "akbkck8101@gmail.com", "010-6658-8101", "2701"), +// new User("신짱구", "남", "zzang9@gmail.com", "010-1234-5678", "9999"), +// new User("김철슈", "남", "steelwater@naver.com", "010-0000-0000", "steelwater"), +// new User("이훈이", "남", "2hun2@naver.com", "010-2345-6789", "2hun222"), +// new User("맹구", "남", "stone_lover9@gmail.com", "010-1010-0101", "stone_lover"), +// new User("한유리", "여", "yuryyy@gmail.com", "010-1111-2222", "12345"), +// new User("한유리", "여", "yuryyy@gmail.com", "010-1111-2222", "12345") //중복 이메일 유저_ex) +// ); +// +// System.out.println("<--------------------유저를 등록합니다------------------------->\n.\n."); +// +// List registeredUsers = users.stream() +// .filter(user -> { +// try { +// userService.create(user); +// System.out.println("유저 등록 완료: " + user.getName()); +// return true; +// } catch (IllegalArgumentException e) { +// System.out.println("!!유저 등록 실패!! " + e.getMessage()); +// return false; +// } +// }) +// .toList(); +// +// System.out.println(".\n.\n<--------------------유저 등록 종료---------------------------->\n"); +// return registeredUsers; +// } +// +// //채널,멤버,카테고리 생성 및 등록 +// private static List createAndRegisterChannels(ChannelService channelService, List users) { +// //채널1 멤버, 카테고리생성 +// Set members1 = new HashSet<>(Set.of(users.get(0), users.get(1), users.get(3))); +// List cat1 = List.of("공지", "질문", "2팀"); +// +// Set members2 = new HashSet<>(Set.of(users.get(1), users.get(2), users.get(4))); +// List cat2 = List.of("이벤트", "소통"); +// +// Set members3 = new HashSet<>(Set.of(users.get(5))); +// List cat3 = List.of("기타"); +// +// //중복 카테고리 +// List cat5 = List.of("공지","공지"); +// +// List channels = List.of( +// new Channel("sp01", users.get(1), cat1, members1), +// new Channel("sp02", users.get(1), cat2, members2), +// new Channel("sp03", users.get(5), cat3, members3), +// new Channel("sp03", users.get(5), cat3, members3), //중복 채널명_ex) +// new Channel("sp05", users.get(5), cat5, members3) //중복 카테고리_ex) +// ); +// +// System.out.println("<--------------------채널을 등록합니다------------------------->\n.\n."); +// +// List registeredChannels = channels.stream() +// .filter(channel -> { +// try { +// channelService.create(channel); +// System.out.println("채널 등록 완료: " + channel.getChannelName()); +// return true; +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 등록 실패!! " + e.getMessage()); +// return false; +// } +// }) +// .toList(); // 성공한 채널만 리스트로 변환 +// +// System.out.println(".\n.\n<--------------------채널 등록 종료---------------------------->\n"); +// return registeredChannels; +// } +// +// //메시지 생성 및 등록 +// private static List createAndRegisterMessages(MessageService messageService, List users, List channels) { +// List messages = List.of( +// new Message(users.get(0), channels.get(0), "공지", "공지입니다."), +// new Message(users.get(1), channels.get(0), "2팀", "안녕하세요."), +// new Message(users.get(4), channels.get(1), "소통", "소통해요"), +// new Message(users.get(2), channels.get(1), "소통", "좋아요"), +// new Message(users.get(5), channels.get(1), "소통", "hi"), //채널 멤버가 아닌 유저 +// new Message(users.get(0), channels.get(0), "공자", "hi") //채널에 없는 카테고리 +// ); +// +// System.out.println("<--------------------메시지를 저장합니다----------------------->\n.\n."); +// +// List registeredMessages = messages.stream() +// .map(message -> { +// try { +// messageService.create(message); +// System.out.println("[" + message.getChannel().getChannelName() + "] 채널에 메시지 등록 완료"); +// return message; +// } catch (IllegalArgumentException e) { +// System.out.println("!!메시지 등록 실패!! " + e.getMessage()); +// return null; +// } +// }) +// .filter(Objects::nonNull) // null 제거 (등록 실패한 메시지 필터링) +// .collect(Collectors.toList()); +// +// System.out.println(".\n.\n<--------------------메시지 저장 종료-------------------------->\n"); +// return registeredMessages; +// } +// +// +// private static void demonstrateUserOperations(UserService userService, List users){ +// System.out.println("\n########################### User ###############################"); +// +// readUser(userService, users); +// updateUser(userService, users); +// deleteUser(userService, users); +// +// } +// +// private static void readUser(UserService userService, List users){ +// System.out.println("------------------------- ReadUser -----------------------------"); +// //전체 유저조회(다건 조회) +// System.out.println("\n전체 유저 목록: "); +// userService.findAll().forEach(System.out::println); +// +// //특정 유저조회(단건 조회, 이름) +// System.out.println("\n신짱구 유저 조회(이름으로 검색): "); +// userService.findByName("신짱구").forEach(System.out::println); +// +// //특정 유저조회(단건 조회, id) +// System.out.println("\n이훈이 유저 조회(id로 검색): "); +// System.out.println(userService.find(users.get(3).getId()).toString()); +// +// //이름에 "구"가 포함된 유저 +// System.out.println("\n이름에 '구'가 포함된 유저('구'로 검색): "); +// userService.findByName("구").forEach(System.out::println); +// } +// private static void updateUser(UserService userService, List users){ +// System.out.println("\n------------------------- UpdateUser ---------------------------"); +// //유저 수정 테스트 +// System.out.println("\n유저 수정하기\n수정 전: "); +// +// //수정하려는 유저 original에 저장 +// User original = users.get(2); +// System.out.println(userService.find(original.getId())); +// +// //수정한 유저정보 updated에 저장 +// User updated = userService.update(original.getId(), new User("김철수", original.getGender(), original.getEmail(), "010-0011-0011", original.getPassword())); +// System.out.println("수정 후(이름, 번호): "); +// System.out.println(userService.find(updated.getId())); +// } +// private static void deleteUser(UserService userService, List users){ +// System.out.println("\n------------------------ DeleteUser ----------------------------"); +// System.out.println("\n전체 유저 목록: "); +// userService.findAll().forEach(System.out::println); +// +// //유저 삭제 실패 +// System.out.println("\n"+ users.get(3).getName() +" 유저 탈퇴 진행중..\n.\n.\n"); +// userService.delete(users.get(3).getId(),"0000"); +// +// //유저 삭제 성공 +// System.out.println("\n"+ users.get(3).getName() +"유저 탈퇴 진행중..\n.\n.\n"); +// userService.delete(users.get(3).getId(),"2hun222"); +// +// //삭제 후 전체 유저 조회 +// System.out.println("\n\n전체 유저 목록: "); +// userService.findAll().forEach(System.out::println); +// System.out.println(); +// } +// +// private static void demonstrateChannelOperations(ChannelService channelService, List channels, List users) { +// System.out.println("\n########################### Channel ############################"); +// +// readChannel(channelService,channels,users); +// updateChannel(channelService,channels,users); +// deleteChannel(channelService,channels,users); +// } +// +// private static void readChannel(ChannelService channelService, List channels, List users){ +// System.out.println("------------------------- ReadChannel --------------------------"); +// System.out.println("\n전체 채널 목록"); +// +// if (channelService.findAllByUserId().isEmpty()) { +// System.out.println("조회할 채널이 없습니다."); +// } else { +// channels.forEach(channel -> System.out.println("[" + channel.getChannelName() + "]")); +// } +// +// +// //특정 채널 정보 +// try { +// Channel channel = channelService.find(channels.get(0).getId()); +// System.out.println("\n채널명: " + channel.getChannelName()); +// System.out.println("카테고리: " + channel.getCategory()); +// +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 조회 실패!! " + e.getMessage()); +// } +// +// //채널 멤버조회 +// try { +// System.out.print("\n[sp01] 채널 멤버: "); +// for (User member : channelService.members(channels.get(0).getId())) { +// System.out.print(member.getName() + " "); +// } +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 조회 실패!! " + e.getMessage()); +// } +// System.out.println(); +// } +// private static void updateChannel(ChannelService channelService, List channels, List users){ +// System.out.println("\n------------------------- UpdateChannel -----------------------"); +// +// //채널 수정 +// Channel original = channels.get(2); //수정하려는 채널 +// +// System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); +// System.out.println("\n["+ original.getChannelName() +"] 수정 완료(채널 이름): "); +// System.out.println("수정 전: " + channelService.find(original.getId())); +// +// //수정한 채널 updated에 저장, 출력(채널명 수정) +// try { +// Channel updatedChannel = channelService.update(original.getId(), new Channel("변경sp03", original.getKeyUser(),original.getCategory(), original.getMembers())); +// System.out.println("수정 후: " + channelService.find(updatedChannel.getId())); +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 수정 실패!! " + e.getMessage()); +// } +// +// //수정한 채널 updated에 저장, 출력(방장 변경 + member에 추가) +// System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); +// System.out.println("\n["+ original.getChannelName() +"] 수정 완료(새 유저로 방장 변경): "); +// System.out.println("수정 전: " + channelService.find(original.getId())); +// +// try { +// Channel updatedChannel = channelService.update(original.getId(), new Channel(original.getChannelName(), users.get(1), original.getCategory(), original.getMembers())); +// System.out.println("수정 후: " + channelService.find(updatedChannel.getId())); +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 수정 실패!! " + e.getMessage()); +// } +// +// //기존 유저에서 방장변경 +// //채널1에서 변경 +// original = channels.get(0); +// System.out.println("\n["+ original.getChannelName() +"] 채널 수정 진행중\n.\n.\n."); +// System.out.println("\n["+ original.getChannelName() +"] 수정 완료(기존 유저로 방장 변경): "); +// System.out.println("수정 전: " + channelService.find(original.getId())); +// +// try { +// Channel updatedChannel = channelService.update(original.getId(), new Channel(original.getChannelName(), users.get(0), original.getCategory(), original.getMembers())); +// System.out.println("수정 후: " + channelService.find(updatedChannel.getId())); +// } catch (IllegalArgumentException e) { +// System.out.println("!!채널 수정 실패!! " + e.getMessage()); +// } +// +// } +// private static void deleteChannel(ChannelService channelService, List channels, List users){ +// System.out.println("\n------------------------ DeleteChannel ------------------------"); +// +// System.out.print("\n전체 채널 목록: \n"); +// channelService.findAllByUserId().forEach(System.out::println); +// +// //채널 삭제 실패 +// System.out.println("\n["+ channels.get(2).getChannelName() +"] 채널 삭제 진행중..\n.\n.\n"); +// channelService.delete(channels.get(2).getId(), users.get(1), "0000"); +// +// //채널 삭제 성공 +// System.out.println("\n["+ channels.get(2).getChannelName() +"] 채널 삭제 진행중..\n.\n.\n"); +// channelService.delete(channels.get(2).getId(), users.get(1), "9999"); +// +// //삭제 후 전체 유저 조회 +// System.out.print("\n전체 채널 목록: \n"); +// channelService.findAllByUserId().forEach(System.out::println); +// +// } +// +// private static void demonstrateMessageOperations(MessageService messageService) { +// System.out.println("\n########################### Message ###########################"); +// +// readMessages(messageService); +// updateMessages(messageService); +// deleteMessages(messageService); +// } +// +// private static void readMessages(MessageService messageService) { +// System.out.println("------------------------- ReadMessage -------------------------"); +// //메시지 전체조회(다건 조회) +// System.out.println("\n전체 메시지"); +// messageService.findAll().forEach(System.out::println); +// +// //메시지3 조회(단건 조회) +// try{ +// System.out.println("\n메시지 조회"); +// System.out.println(messageService.find(messageService.findAll().get(2).getId())); +// +// } catch (IllegalArgumentException e) { +// System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); +// +// } +// +// //존재하지 않는 메시지 조회 +// try{ +// System.out.println("\n메시지 조회"); +// System.out.println(messageService.find(UUID.randomUUID())); +// } catch (IllegalArgumentException e) { +// System.out.println("\n!!메시지 조회 실패!!" + e.getMessage()); +// } +// } +// private static void updateMessages(MessageService messageService) { +// System.out.println("\n------------------------- UpdateMessage ------------------------"); +// //수정할 메시지 original변수에 저장 +// Message original = messageService.find(messageService.findAll().get(0).getId()); +// System.out.println("\n메시지1 수정 전: \n" + messageService.find(original.getId())); +// +// //변경 메시지 updated변수에 저장 +// Message updated = new Message(original.getSender(), original.getChannel(), original.getCategory(), "공지 수정합니다~~~~"); +// +// //메시지 수정 +// messageService.update(original.getId(), updated); +// System.out.println("\n메시지1 수정 후: \n" + messageService.find(original.getId())); +// +// //수정후 전체 메시지 +// System.out.println("\n전체 메시지"); +// messageService.findAll().forEach(System.out::println); +// } +// private static void deleteMessages(MessageService messageService) { +// System.out.println("\n------------------------ DeleteMessage ------------------------"); +// //메시지 삭제 +// System.out.println("\n.\n.\n<<메시지4 삭제 완료>>\n"); +// messageService.delete(messageService.findAll().get(3).getId()); +// +// //메시지 삭제 후 재조회 +// System.out.print("삭제 후 전체 메시지: \n"); +// messageService.findAll().forEach(System.out::println); +// } +// +//} diff --git a/src/main/java/com/sprint/mission/discodeit/channel.ser b/src/main/java/com/sprint/mission/discodeit/channel.ser deleted file mode 100644 index a80faa23..00000000 Binary files a/src/main/java/com/sprint/mission/discodeit/channel.ser and /dev/null differ diff --git a/src/main/java/com/sprint/mission/discodeit/common/ErrorMessages.java b/src/main/java/com/sprint/mission/discodeit/common/ErrorMessages.java new file mode 100644 index 00000000..125c8d28 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/common/ErrorMessages.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.common; + +public class ErrorMessages { + public static final String ERROR_NOT_FOUND = "해당 %s을(를) 찾을 수 없습니다!"; + public static final String ERROR_EXISTS = "이미 등록된 %s입니다!"; + public static final String ERROR_MISMATCH = "%s 불 일치!"; + + public static final String ERROR_FILE_UPLOAD_INVALID = "%s 업로드 대상 또는 내용이 잘못되었습니다!"; + + public static final String ERROR_PRIVATE_CHANNEL_NOT_UPDATE = "private 채널은 수정할 수 없습니다."; + + public static final String ERROR_EMPTY = "%s 내용은 비어있을 수 없습니다."; + + public static final String ERROR_FILE_PATH_NULL = "%s 설정이 null입니다. application.yaml 설정 확인 필요"; + public static final String ERROR_SAVE = "%s 저장 중 오류 발생!"; + public static final String ERROR_LOAD = "%s 불러오기 중 오류 발생!"; + + public static String format(String entityName, String messageTemplate) { + return String.format(messageTemplate, entityName); + } + +} diff --git a/src/main/java/com/sprint/mission/discodeit/config/DiscodeitProperties.java b/src/main/java/com/sprint/mission/discodeit/config/DiscodeitProperties.java new file mode 100644 index 00000000..712257f1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/DiscodeitProperties.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Getter @Setter +@ConfigurationProperties(prefix = "discodeit.repository") +public class DiscodeitProperties { + private String type; + private String filePath; +} diff --git a/src/main/java/com/sprint/mission/discodeit/config/RepositoryConfig.java b/src/main/java/com/sprint/mission/discodeit/config/RepositoryConfig.java new file mode 100644 index 00000000..ca8e6484 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/RepositoryConfig.java @@ -0,0 +1,75 @@ +package com.sprint.mission.discodeit.config; + +import com.sprint.mission.discodeit.repository.*; +import com.sprint.mission.discodeit.repository.file.*; +import com.sprint.mission.discodeit.repository.jcf.*; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class RepositoryConfig { + + private final DiscodeitProperties properties; + + @Bean + public UserRepository userRepository(ChannelRepository channelRepository) { + String type = properties.getType(); + + if ("file".equalsIgnoreCase(type)) { + return new FileUserRepository(properties, channelRepository); + } else { // "jcf" 또는 null인 경우 기본값 + return new JCFUserRepository(); + } + } + @Bean + public ChannelRepository channelRepository() { + String type = properties.getType(); + if ("file".equalsIgnoreCase(type)) { + return new FileChannelRepository(properties); + } else { + return new JCFChannelRepository(); + } + } + + @Bean + public MessageRepository messageRepository(UserRepository userRepository, ChannelRepository channelRepository) { + String type = properties.getType(); + if ("file".equalsIgnoreCase(type)) { + return new FileMessageRepository(properties, userRepository, channelRepository); + } else { + return new JCFMessageRepository(); + } + } + + @Bean + public ReadStatusRepository readStatusRepository() { + String type = properties.getType(); + if ("file".equalsIgnoreCase(type)) { + return new FileReadStatusRepository(properties); + } else { + return new JCFReadStatusRepository(); + } + } + + @Bean + public UserStatusRepository userStatusRepository() { + String type = properties.getType(); + if ("file".equalsIgnoreCase(type)) { + return new FileUserStatusRepository(properties); + } else { + return new JCFUserStatusRepository(); + } + } + + @Bean + public BinaryContentRepository binaryContentRepository() { + String type = properties.getType(); + if ("file".equalsIgnoreCase(type)) { + return new FileBinaryContentRepository(properties); + } else { + return new JCFBinaryContentRepository(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Response/BinaryContentResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Response/BinaryContentResponse.java new file mode 100644 index 00000000..9dd78d2b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Response/BinaryContentResponse.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.Response; + +import java.util.UUID; + +public record BinaryContentResponse( + UUID id, + String contentType, + String originalFilename, + String url +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Response/ChannelResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Response/ChannelResponse.java new file mode 100644 index 00000000..bfb07c67 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Response/ChannelResponse.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.dto.Response; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public record ChannelResponse( + UUID channelId, + String channelName, + List categories, + boolean isPrivate, + Instant lastMessageTime, + List memberIds, + UUID creatorId +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Response/MessageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Response/MessageResponse.java new file mode 100644 index 00000000..144d0a14 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Response/MessageResponse.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.dto.Response; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public record MessageResponse( + UUID id, + String content, + String senderName, + Instant sentAt, + List attachments +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Response/UserResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Response/UserResponse.java new file mode 100644 index 00000000..04202ee5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Response/UserResponse.java @@ -0,0 +1,16 @@ +package com.sprint.mission.discodeit.dto.Response; + +import java.util.UUID; + + +public record UserResponse( + UUID id, + String userName, + String email, + String phone, + String password, + UUID profileImageId, + String profileImageUrl, + boolean online +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/Response/UserStatusResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/Response/UserStatusResponse.java new file mode 100644 index 00000000..fa0d6aea --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/Response/UserStatusResponse.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.Response; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusResponse( + UUID userId, + boolean online, + Instant lastOnlineTime +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentRequest.java new file mode 100644 index 00000000..b23b0bb3 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record BinaryContentRequest( + byte[] content, + String contentType, + String originalFilename +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java new file mode 100644 index 00000000..254e45cb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.request; + +public record LoginRequest( + String userName, + String password +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/BinaryContentCreateRequest.java new file mode 100644 index 00000000..cf5f17c0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/BinaryContentCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import java.util.UUID; + +public record BinaryContentCreateRequest( + UUID userId, + UUID messageId, + byte[] content, + String contentType, + String originalFilename +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_private.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_private.java new file mode 100644 index 00000000..1a86ec03 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_private.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public record ChannelCreateRequest_private( + UUID creatorId, + Set memberIds +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_public.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_public.java new file mode 100644 index 00000000..26a8bdad --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ChannelCreateRequest_public.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public record ChannelCreateRequest_public( + String channelName, + UUID creatorId, + List categories, + Set memberIds +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/MessageCreateRequest.java new file mode 100644 index 00000000..b93f4379 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/MessageCreateRequest.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import com.sprint.mission.discodeit.dto.request.BinaryContentRequest; + +import java.util.List; +import java.util.UUID; + +public record MessageCreateRequest( + UUID senderId, + UUID channelId, + String category, + String content, + List attachments +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ReadStatusCreateRequest.java new file mode 100644 index 00000000..99f8cb37 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/ReadStatusCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusCreateRequest( + UUID userId, + UUID channelId, + Instant lastReadTime +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserCreateRequest.java new file mode 100644 index 00000000..dfc84591 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserCreateRequest.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import org.springframework.web.multipart.MultipartFile; + +import java.util.UUID; + +public record UserCreateRequest( + String name, + String email, + String phone, + String password, + UUID profileImageId, //선택, 없으면 null + BinaryContentCreateRequest profileImage //선택, 없으면 null +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserStatusCreateRequest.java new file mode 100644 index 00000000..32c7f8bd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/create/UserStatusCreateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request.create; + +import java.util.UUID; + +public record UserStatusCreateRequest( + UUID userId, + boolean isOnline +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/update/ChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/update/ChannelUpdateRequest.java new file mode 100644 index 00000000..9a62d9d8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/update/ChannelUpdateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.request.update; + +import java.util.List; +import java.util.UUID; + +public record ChannelUpdateRequest( + UUID channelId, + String newChannelName, + List newCategories, + UUID newKeyUserId +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/update/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/update/MessageUpdateRequest.java new file mode 100644 index 00000000..b1de43c9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/update/MessageUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request.update; + +import java.util.UUID; + +public record MessageUpdateRequest( + UUID messageId, + String newContent +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/update/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/update/ReadStatusUpdateRequest.java new file mode 100644 index 00000000..43bc5f9a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/update/ReadStatusUpdateRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.request.update; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusUpdateRequest( + UUID id, + Instant newReadTime +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserStatusUpdateRequest.java new file mode 100644 index 00000000..f92b5872 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserStatusUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request.update; + +import java.util.UUID; + +public record UserStatusUpdateRequest( + UUID id, + boolean newOnlineStatus +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserUpdateRequest.java new file mode 100644 index 00000000..b76dd033 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/update/UserUpdateRequest.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.dto.request.update; + +import jakarta.validation.constraints.NotNull; +import org.springframework.web.multipart.MultipartFile; + +import java.util.UUID; + +public record UserUpdateRequest( + @NotNull + UUID id, + String username, + String email, + String phone, + String password, + MultipartFile profileImage +) { +} 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..87b27e7d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,38 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +/*바이너리 데이터 표현 도메인 +* 프로필이미지, 메시지 첨부 파일 저장하기 위해 +* userId(messageId=null)-> 프로필이미지 반대면 메시지 첨부파일 +* 수정불가한 도메인 +* */ +@Getter +public class BinaryContent implements Serializable { + private static final long serialVersionUID = 1L; + private final UUID id; + + private final UUID userId; //프로필이미지 + private final UUID messageId; //첨부파일 + + private final byte[] content; + private final String contentType; + private final String originalFilename; + private final String url; + private final Instant createdAt; + + public BinaryContent(UUID userId, UUID messageId, byte[] content, String contentType, String originalFilename) { + this.id = UUID.randomUUID(); + this.userId = userId; + this.messageId = messageId; + this.content = content; + this.contentType = contentType; + this.originalFilename = originalFilename; + this.url = "/files/" + originalFilename; + this.createdAt = Instant.now(); + } +} 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 eac0e57c..b1bf9d56 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,105 +1,79 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.common.ErrorMessages; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; +@Getter @Setter public class Channel implements Serializable { private static final long serialVersionUID = 1L; private UUID id; private String channelName; - private User keyUser; + private User creator; private List categories; private Set members; - private long createdAt; - private long updatedAt; - public Channel(String channelName, User keyUser, List categories, Set members) { - this.id = UUID.randomUUID(); - this.channelName = channelName; - this.categories = categories; + private boolean isPrivate; - this.keyUser = keyUser; - this.members = new HashSet<>(members); - this.members.add(keyUser); + private Instant createdAt; + private Instant updatedAt; - this.createdAt = System.currentTimeMillis(); - this.updatedAt = this.createdAt; //updatedAt의 처음 시간은 createAt과 동일해야 함 - } + public Channel(String channelName, User creator, List categories, Set members , boolean isPrivate) { + this.id = UUID.randomUUID(); + this.channelName = channelName != null ? channelName : ""; + this.categories = categories != null ? categories : new ArrayList<>(); - public UUID getId() { - return id; - } + this.creator = creator; + this.members = new HashSet<>(members); + this.members.add(creator); - public String getChannelName() { - return channelName; - } + this.isPrivate = isPrivate; - public void setChannelName(String channelName) { - this.channelName = channelName; + this.createdAt = Instant.now(); + this.updatedAt = this.createdAt; //updatedAt의 처음 시간은 createAt과 동일해야 함 } - public List getCategory() { - return categories; + public void update(Channel updateChannelData) { + this.channelName = updateChannelData.channelName; + this.creator = updateChannelData.creator; + this.categories = new ArrayList<>(updateChannelData.categories); + this.members = new HashSet<>(updateChannelData.members); + this.updatedAt = Instant.now(); } - public void setCategory(List categories) { - this.categories = categories; + public void update(String newChannelName, List newCategories) { + this.channelName = newChannelName; + this.categories = new ArrayList<>(newCategories); + this.updatedAt = Instant.now(); } - public Set getMembers() { - return members; - } public void setMembers(Set members) { this.members = members; } - public long getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public long getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - } - - public User getKeyUser() { - return keyUser; - } - - public void addMember(User user) { - members.add(user); - } - - public void update(Channel updateChannelData) { - this.channelName = updateChannelData.channelName; - this.keyUser = updateChannelData.keyUser; - this.categories = new ArrayList<>(updateChannelData.categories); - this.members = new HashSet<>(updateChannelData.members); - this.updatedAt = System.currentTimeMillis(); - } - //채널 멤버가 아닌 유저가 메시지 생성시 public void validateMembership(User sender) { if (!members.contains(sender)) { throw new IllegalArgumentException( - " ---" + sender.getName() + "(은/는) [" + channelName + "]채널 멤버가 아닙니다."); + ErrorMessages.format("Sender", ErrorMessages.ERROR_NOT_FOUND)); } } //카테고리 중복 확인 public void validateUniqueCategory() { - Set categorySet = new HashSet<>(this.categories); - if (categorySet.size() != this.categories.size()) { - throw new IllegalArgumentException(" --- 중복된 카테고리가 포함되어 있습니다."); + Set unique = new HashSet<>(); + for (String category : this.categories) { + if (!unique.add(category)) { + throw new IllegalArgumentException( + ErrorMessages.format("Category", ErrorMessages.ERROR_EXISTS) + ); + } } } @@ -107,12 +81,13 @@ public void validateUniqueCategory() { public void validateCategory(String category){ if (!categories.contains(category)) { throw new IllegalArgumentException( - " ---"+ category + "(은/는) [" +channelName + "]채널에 존재 하지 않는 카테고리입니다."); + ErrorMessages.format("Category", ErrorMessages.ERROR_NOT_FOUND) + ); } } - public void addKeyUserToMembers() { - this.members.add(this.keyUser); + public void addCreatorToMembers() { + this.members.add(this.creator); } @Override @@ -130,7 +105,7 @@ public boolean equals(Object obj) { public String toString() { return "Channel{" + "ChannelName= '" + channelName + '\'' + - ", KeyUser= '" + keyUser.getName() + '\'' + + ", KeyUser= '" + creator.getName() + '\'' + ", Category= '" + categories + '\'' + ", Members= '" + members.stream().map(User::getName).collect(Collectors.toList()) + "'}"; 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 c347ae66..331c191a 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,44 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.common.ErrorMessages; +import lombok.Getter; + import java.io.Serializable; -import java.util.List; -import java.util.Set; +import java.time.Instant; import java.util.UUID; +@Getter public class Message implements Serializable { private static final long serialVersionUID = 1L; private UUID id; - private User sender; //보낸사람 - private Channel channel; + private UUID senderId; //보낸사람 + private UUID channelId; private String category; private String content; //내용 - private long createdAt; - private long updatedAt; + private Instant createdAt; + private Instant updatedAt; - public Message(User sender,Channel channel, String category, String content) { + public Message(UUID senderId, UUID channelId, String category, String content) { this.id = UUID.randomUUID(); - this.sender = sender; - this.channel = channel; + this.senderId = senderId; + this.channelId = channelId; this.category = category; this.content = content; - this.createdAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); this.updatedAt = this.createdAt; //updatedAt의 처음 시간은 createAt과 동일해야 함 - - } - - public UUID getId() { - return id; - } - - public User getSender() { - return sender; - } - public void setSender(User sender) { - this.sender = sender; - } - - public Channel getChannel() { - return channel; - } - public void setChannel(Channel channel) { - this.channel = channel; - } - - public String getCategory() {return category;} - public void setCategory(String category) { - this.category = category; - } - - public long getCreatedAt() { - return createdAt; - } - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; } - public String getContent() { - return content; - } - public void setContent(String content) { + public void update(String content) { this.content = content; - } - - public long getUpdatedAt() { - return updatedAt; - } - public void setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - } - - public void update(Message updateMessageData) { - this.content = updateMessageData.content; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } public void validateContent() { if (content == null || content.trim().isEmpty()) { - throw new IllegalArgumentException("메시지 내용은 비어있을 수 없습니다."); + throw new IllegalArgumentException( + ErrorMessages.format("MessageContent", ErrorMessages.ERROR_EMPTY) + ); } } @@ -97,8 +57,8 @@ public boolean equals(Object obj) { public String toString() { return "Message{" + "id= '" + id + '\'' + - ", sender= '" + sender.getName() + '\'' + - ", channel= '" + channel.getChannelName() + '\'' + + ", sender= '" + senderId + '\'' + + ", channel= '" + channelId + '\'' + ", category= '" + category + '\'' + ", content= '" + content + '\'' + '}'; 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..66387771 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,36 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +/*사용자가 채널 별 마지막으로 메시지를 읽은 시간을 표현 하는 도메인 +* 사용자별 각 채널에 읽지 않은 메시지 확인하기 +* 메시지를 읽음 -> updatedAt 시간이 현재 시간으로*/ +@Getter @Setter +public class ReadStatus implements Serializable { + private static final long serialVersionUID = 1L; + private UUID id; + private UUID userId; + private UUID channelId; + private Instant lastReadTime; + + private Instant createdAt; + private Instant updatedAt; + + public ReadStatus(UUID userId, UUID channelId, Instant createdAt) { + this.id = UUID.randomUUID(); + this.userId = userId; + this.channelId = channelId; + this.createdAt = Instant.now(); + this.updatedAt = createdAt; + } + + public void updateLastReadTime(Instant newReadTime) { + this.lastReadTime = newReadTime; + 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 4b7e7871..587cd8bf 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,91 +1,36 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashSet; +import java.time.Instant; import java.util.UUID; +@Getter @Setter public class User implements Serializable { private static final long serialVersionUID = 1L; private UUID id; - private String gender; private String name; private String email; private String phone; private transient String password; - private long createdAt; - private long updatedAt; + private Instant createdAt; + private Instant updatedAt; + + private UUID profileImageId; - public User(String name, String gender, String email, String phone, String password) { + public User(String name, String email, String phone, String password) { this.id = UUID.randomUUID(); this.name = name; - this.gender = gender; this.email = email; this.phone = phone; this.password = password; - this.createdAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); this.updatedAt = this.createdAt; //updatedAt의 처음 시간은 createAt과 동일해야 함 - } - - public UUID getId() { - return id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public long getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public long getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; + this.profileImageId = null; } @Override @@ -102,17 +47,22 @@ public boolean equals(Object obj) { public void update(User updateUserData) { this.name = updateUserData.name; - this.gender = updateUserData.gender; this.email = updateUserData.email; this.phone = updateUserData.phone; this.password = updateUserData.password; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); + + this.profileImageId = updateUserData.profileImageId; + } + + public String getProfileImageUrl() { + return (profileImageId != null) ? "/files/" + profileImageId : null; } public String toString() { return "User{" + "UserName= '" + name + '\'' + - ", Gender= '" + gender + '\'' + + ", ProfileId= '" + profileImageId + '\'' + ", email= '" + email + '\'' + ", phone= '" + phone + '\'' + ", password= '" + password + '\'' + 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..ac0a790c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,58 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + +/*사용자 별 마지막으로 확인된 접속시간 표현(사용자의 온라인 상태 확인) +* 마지막 접속 시간이 현재시간으로 부터 5분이내일때 접속중인 유저로 간주 +* 접속중인 유저 = 현재 로그인한 유저로 판단 +* +* 헷갈린다 updateAt을 마지막 접속시간으로 쓰면 안되는 것?? +* +* updatedAt은 객체의 마지막 수정 시간(상태메시지, 로그인 등) + * lastOnlineTime은 사용자가 언제 마지막으로 접속했는가?? +* 나중에 메소드 추가를 위해? 분리하는 것이 좋다?*/ +@Getter @Setter +public class UserStatus implements Serializable { + private static final long serialVersionUID = 1L; + private UUID userId; //User에서도 userId로 변경하는게 좋을까? + private Instant lastOnlineTime; + + private Instant createdAt; + private Instant updatedAt; + + private boolean online; + + public UserStatus(UUID userId, boolean online) { + this.userId = userId; + this.createdAt = Instant.now(); + this.updatedAt = this.createdAt; + this.lastOnlineTime = online ? Instant.now() : null; + this.online = online; + } + + //lastOnlineTime update + public void updatelastOnline() { + this.lastOnlineTime = Instant.now(); + this.updatedAt = Instant.now(); + this.online = isOnlineNow(); + } + + //지금 온라인 상태인지?(5분 이내 인지) + public boolean isOnlineNow() { + return lastOnlineTime != null && + Duration.between(lastOnlineTime, Instant.now()).toMinutes() <= 5; + } + + //온라인상태 수동변경 + public void updateOnlineStatus(boolean online) { + this.online = online; + this.lastOnlineTime = Instant.now(); + this.updatedAt = Instant.now(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java index c6e6c2f6..e8734a65 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java @@ -1,70 +1,53 @@ -package com.sprint.mission.discodeit.factory; - -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; - -public class ServiceFactory { - - private static final ServiceFactory instance = new ServiceFactory(); - - private final ChannelService channelService; - private final UserService userService; - private final MessageService messageService; - - //FileRepository 구현체를 활용 - private ServiceFactory() { - FileChannelRepository channelRepository = new FileChannelRepository(); - FileUserRepository userRepository = new FileUserRepository(channelRepository); - FileMessageRepository messageRepository = new FileMessageRepository(userRepository, channelRepository); - - this.channelService = new BasicChannelService(channelRepository); - this.userService = new BasicUserService(channelRepository, userRepository); - this.messageService = new BasicMessageService(messageRepository, userRepository, channelRepository); - } - -//JCFRepository 구현체를 활용 +//package com.sprint.mission.discodeit.factory; +// +//import com.sprint.mission.discodeit.repository.BinaryContentRepository; +//import com.sprint.mission.discodeit.repository.UserStatusRepository; +//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; +// +//public class ServiceFactory { +// +// private static final ServiceFactory instance = new ServiceFactory(); +// +// private final ChannelService channelService; +// private final UserService userService; +// private final MessageService messageService; +// +// // private ServiceFactory() { -// JCFChannelRepository channelRepo = new JCFChannelRepository(); -// JCFUserRepository userRepo = new JCFUserRepository(channelRepo); -// JCFMessageRepository messageRepo = new JCFMessageRepository(userRepo, channelRepo); +// FileChannelRepository channelRepository = new FileChannelRepository(); +// FileUserRepository userRepository = new FileUserRepository(channelRepository); +// FileMessageRepository messageRepository = new FileMessageRepository(userRepository, channelRepository); // -// UserService userService = new BasicUserService(channelRepo, userRepo); -// ChannelService channelService = new BasicChannelService(channelRepo); -// MessageService messageService = new BasicMessageService(messageRepo, userRepo, channelRepo); +// UserStatusRepository userStatusRepository = new UserStatusRepository(); +// BinaryContentRepository binaryContentRepository = new BinaryContentRepository(); +// +// this.channelService = new BasicChannelService(channelRepository); +// this.userService = new BasicUserService(channelRepository, userRepository, userStatusRepository, binaryContentRepository); +// this.messageService = new BasicMessageService(messageRepository, userRepository, channelRepository); // } - -//JCFService 구현체를 활용 -// private ServiceFactory() { -// ChannelService channelService = JCFChannelService.getInstance(); -// UserService userService = JCFUserService.getInstance(channelService); -// MessageService messageService = JCFMessageService.getInstance(userService, channelService); // -// this.channelService = channelService; -// this.userService = userService; -// this.messageService = messageService; +// public static ServiceFactory getInstance() { +// return instance; // } - - public static ServiceFactory getInstance() { - return instance; - } - - public ChannelService createChannelService() { - return channelService; - } - - public UserService createUserService() { - return userService; - } - - public MessageService createMessageService() { - return messageService; - } - -} +// +// public ChannelService createChannelService() { +// return channelService; +// } +// +// public UserService createUserService() { +// return userService; +// } +// +// public MessageService createMessageService() { +// return messageService; +// } +// +//} diff --git a/src/main/java/com/sprint/mission/discodeit/message.ser b/src/main/java/com/sprint/mission/discodeit/message.ser deleted file mode 100644 index c9612fb6..00000000 Binary files a/src/main/java/com/sprint/mission/discodeit/message.ser and /dev/null differ 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..1446ee41 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,23 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.BinaryContent; + +import java.util.List; +import java.util.UUID; + +public interface BinaryContentRepository { + public BinaryContent save(BinaryContent binaryContent); + + public BinaryContent find(UUID id); + + public List findAll(); + + public boolean delete(UUID id); + + //특정 유저의 (프로필 이미지 등) 바이너리 조회 + public List findByUserId(UUID userId); + + public boolean deleteByUserId(UUID userId); + + public boolean deleteByMessageId(UUID messageId); +} 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 8d5d63d0..41c2ae16 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -4,22 +4,23 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; public interface ChannelRepository{ - public void create(Channel channel); + public Channel create(Channel channel); - public Channel read(UUID id); + public Optional find(UUID id); - public List readAll(); + public List findAll(); public Channel update(UUID id, Channel update); - public boolean delete(UUID id, User user, String password); + public boolean delete(UUID id, UUID userId, String password); public Set members(UUID id); - public List readByName(String channelName); + public List findByChannelName(String channelName); } 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 4d3c3bff..b86918f9 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -2,18 +2,23 @@ import com.sprint.mission.discodeit.entity.Message; +import java.time.Instant; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface MessageRepository { - public void create(Message message); + public Message create(Message message); - public Message read(UUID id); + public Message find(UUID id); - public List readAll(); + public List findAll(); public Message update(UUID id, Message update); public boolean delete(UUID id); + public Optional findLastMessageTimeByChannelId(UUID channelId); + + public boolean deleteByChannelId(UUID channelId); } 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..91275e77 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.ReadStatus; + +import java.util.List; +import java.util.UUID; + +public interface ReadStatusRepository { + public ReadStatus create(ReadStatus readStatus); + + public ReadStatus find(UUID id); + + public List findAll(); + + public List findByUserId(UUID userId); + + public List findByChannelId(UUID channelId); + + public ReadStatus update(ReadStatus update); + + public boolean delete(UUID id); + + public boolean deleteByUserId(UUID userId); + + public boolean deleteByChannelId(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 fdfbbd73..6e771d67 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -3,18 +3,19 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface UserRepository { - public void create(User user); + public User create(User user); - public User read(UUID id); + public Optional find(UUID id); - public List readByName(String name); + public Optional findByUserName(String name); - public List readAll(); + public List findAll(); - public User update(UUID id, User update); + public User update(User update); public boolean delete(UUID id); 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..9afef845 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,23 @@ +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 { + public UserStatus create(UserStatus userstatus); + + public UserStatus find(UUID id); + + public List findAll(); + + public Optional findByUserId(UUID userId); + + public UserStatus update(UserStatus update); + + public boolean delete(UUID id); + + public boolean deleteByUserId(UUID userId); +} 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..5b02de8d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -0,0 +1,117 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; + +@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file") +@Repository +public class FileBinaryContentRepository implements BinaryContentRepository { + private final String filePath; + private Map data; + + public FileBinaryContentRepository(DiscodeitProperties properties) { + this.filePath = properties.getFilePath() + "/binarycontent.ser"; + this.data = loadData(); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + BinaryContent content = new BinaryContent( + binaryContent.getUserId(), + binaryContent.getMessageId(), + binaryContent.getContent(), + binaryContent.getContentType(), + binaryContent.getOriginalFilename() + ); + data.put(content.getId(), content); // ID 기준으로 저장 + saveData(); // 파일 저장 등 + + return content; + } + + @Override + public BinaryContent find(UUID id) { + return this.data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public List findByUserId(UUID userId) { + return data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .collect(Collectors.toList()); + } + + @Override + public boolean delete(UUID id) { + return this.data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .map(BinaryContent::getId) + .toList(); + + boolean deleted = false; + for(UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + saveData(); + return deleted; + } + + @Override + public boolean deleteByMessageId(UUID messageId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getMessageId(), messageId)) + .map(BinaryContent::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + saveData(); + return deleted; + } + + private void saveData() { + try (FileOutputStream fos = new FileOutputStream(filePath); + ObjectOutputStream oos = new ObjectOutputStream(fos)) { + oos.writeObject(data); + } catch (IOException e) { + System.out.println(ErrorMessages.format("[binaryContent]", ErrorMessages.ERROR_SAVE)); + e.printStackTrace(); + } + } + + // 불러오기 메서드 + @SuppressWarnings("unchecked") + private Map loadData() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + System.out.println(ErrorMessages.format("[binaryContent]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); + } catch (IOException | ClassNotFoundException e) { + System.out.println(ErrorMessages.format("[binaryContent]", ErrorMessages.ERROR_LOAD)); + e.printStackTrace(); + } + // 실패 시 빈 Map 반환 + return new HashMap<>(); + } +} 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 090f2b80..5c1307dd 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 @@ -1,42 +1,56 @@ package com.sprint.mission.discodeit.repository.file; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.util.DataInitializer; +import jakarta.annotation.PostConstruct; import java.io.*; import java.util.*; import java.util.stream.Collectors; -import static com.sprint.mission.discodeit.util.DataInitializer.*; public class FileChannelRepository implements ChannelRepository { - private final String FILE_PATH = CHANNEL_FILE_PATH; + private final String filePath; + private Map data; - private Map data = loadData(); + public FileChannelRepository(DiscodeitProperties properties) { + if (properties.getFilePath() == null) { + System.out.println(ErrorMessages.format("[Channel]", ErrorMessages.ERROR_FILE_PATH_NULL)); + } + this.filePath = properties.getFilePath() + "/channel.ser"; + this.data = new HashMap<>(); + } + // 파일 있으면 불러오기 + @PostConstruct + public void init() { + this.data = loadData(); + } //채널 생성 @Override - public void create(Channel channel) { + public Channel create(Channel channel) { data.put(channel.getId(), channel); saveData(); + return channel; } //채널 조회 @Override - public Channel read(UUID id) { - return this.data.get(id); + public Optional find(UUID id) { + return Optional.ofNullable(this.data.get(id)); } //채널 전체 조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(data.values()); } //특정 채널 정보 - public List readByName(String channelName) { + public List findByChannelName(String channelName) { List result = data.values().stream() .filter(channel -> channel.getChannelName().contains(channelName)) .collect(Collectors.toList()); @@ -48,12 +62,13 @@ public List readByName(String channelName) { public Channel update(UUID id, Channel update) { Channel channel = this.data.get(id); channel.update(update); + saveData(); return channel; } //채널 삭제 @Override - public boolean delete(UUID id, User user, String password) { + public boolean delete(UUID id, UUID userId, String password) { return this.data.remove(id) != null; } @@ -65,11 +80,11 @@ public Set members(UUID id) { } private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); + try (FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(data); } catch (IOException e) { - System.err.println("[메시지] 데이터 저장 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[Channel]", ErrorMessages.ERROR_SAVE)); e.printStackTrace(); } } @@ -77,12 +92,13 @@ private void saveData() { // 불러오기 메서드 @SuppressWarnings("unchecked") private Map loadData() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { return (Map) ois.readObject(); } catch (FileNotFoundException e) { - System.out.println("[메시지] 저장된 파일이 없습니다. 새 데이터를 시작합니다."); + System.out.println(ErrorMessages.format("[Channel]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); } catch (IOException | ClassNotFoundException e) { - System.out.println("[메시지] 데이터 불러오기 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[Channel]", ErrorMessages.ERROR_LOAD)); e.printStackTrace(); } // 실패 시 빈 Map 반환 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 2be15b46..a509ac63 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 @@ -1,46 +1,56 @@ package com.sprint.mission.discodeit.repository.file; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; - -import static com.sprint.mission.discodeit.util.DataInitializer.*; +import jakarta.annotation.PostConstruct; import java.io.*; +import java.time.Instant; import java.util.*; -public class FileMessageRepository implements MessageRepository { - private static final long serialVersionUID = 1L; - - private final String FILE_PATH = MESSAGE_FILE_PATH; +public class FileMessageRepository implements MessageRepository { + private final String filePath; private final UserRepository userRepository; private final ChannelRepository channelRepository; + private Map data; - private final Map data = loadData(); - - public FileMessageRepository(UserRepository userRepository, ChannelRepository channelRepository) { + public FileMessageRepository(DiscodeitProperties properties, UserRepository userRepository, ChannelRepository channelRepository) { + if (properties.getFilePath() == null) { + System.out.println(ErrorMessages.format("[Message]", ErrorMessages.ERROR_FILE_PATH_NULL)); + } + this.filePath = properties.getFilePath() + "/message.ser"; this.userRepository = userRepository; this.channelRepository = channelRepository; + this.data = new HashMap<>(); } + // 파일 있으면 불러오기 + @PostConstruct + public void init() { + this.data = loadData(); + } //메시지 생성 @Override - public void create(Message message) { + public Message create(Message message) { data.put(message.getId(), message); saveData(); + return message; } //메시지 조회 @Override - public Message read(UUID id) { + public Message find(UUID id) { return this.data.get(id); } //메시지 전체조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(this.data.values()); } @@ -48,7 +58,8 @@ public List readAll() { @Override public Message update(UUID id, Message update) { Message selected = this.data.get(id); - selected.update(update); + selected.update(update.getContent()); + saveData(); return selected; } @@ -58,12 +69,36 @@ public boolean delete(UUID id) { return data.remove(id) != null; } + @Override + public Optional findLastMessageTimeByChannelId(UUID channelId) { + return data.values().stream() + .filter(msg -> Objects.equals(msg.getChannelId(), channelId)) + .map(Message::getCreatedAt) + .max(Comparator.naturalOrder()); + } + + @Override + public boolean deleteByChannelId(UUID channelId) { + List toRemove = data.values().stream() + .filter(message -> Objects.equals(message.getChannelId(), channelId)) + .map(Message::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + + saveData(); + return deleted; + } + private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); + try (FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(data); } catch (IOException e) { - System.err.println("[메시지] 데이터 저장 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[Message]", ErrorMessages.ERROR_SAVE)); e.printStackTrace(); } } @@ -71,12 +106,14 @@ private void saveData() { // 불러오기 메서드 @SuppressWarnings("unchecked") private Map loadData() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { return (Map) ois.readObject(); } catch (FileNotFoundException e) { - System.out.println("[메시지] 저장된 파일이 없습니다. 새 데이터를 시작합니다."); + System.out.println(ErrorMessages.format("[Message]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); } catch (IOException | ClassNotFoundException e) { - System.out.println("[메시지] 데이터 불러오기 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[Message]", ErrorMessages.ERROR_LOAD)); + e.printStackTrace(); } // 실패 시 빈 Map 반환 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..1c191f84 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -0,0 +1,131 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import jakarta.annotation.PostConstruct; + +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; + + +public class FileReadStatusRepository implements ReadStatusRepository { + private final String filePath; + private Map data; + + public FileReadStatusRepository(DiscodeitProperties properties) { + if (properties.getFilePath() == null) { + System.out.println(ErrorMessages.format("[ReadStatus]", ErrorMessages.ERROR_FILE_PATH_NULL)); + } + this.filePath = properties.getFilePath() + "/readstatus.ser"; + this.data = new HashMap<>(); + } + + // 파일 있으면 불러오기 + @PostConstruct + public void init() { + this.data = loadData(); + } + + @Override + public ReadStatus create(ReadStatus readStatus) { + data.put(readStatus.getId(), readStatus); + saveData(); + return readStatus; + } + + @Override + public ReadStatus find(UUID id) { + return this.data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public ReadStatus update(ReadStatus update) { + ReadStatus readStatus = this.data.get(update.getId()); + readStatus.updateLastReadTime(update.getLastReadTime()); + return readStatus; + } + + @Override + public List findByUserId(UUID userId) { + return data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .collect(Collectors.toList()); + } + + @Override + public List findByChannelId(UUID channelId) { + return data.values().stream() + .filter(file -> Objects.equals(file.getChannelId(), channelId)) + .collect(Collectors.toList()); + } + + @Override + public boolean delete(UUID id) { + return this.data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .map(ReadStatus::getId) + .toList(); + + boolean deleted = false; + for(UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + saveData(); + return deleted; + } + + @Override + public boolean deleteByChannelId(UUID channelId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getChannelId(), channelId)) + .map(ReadStatus::getId) + .toList(); + + boolean deleted = false; + for(UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + saveData(); + return deleted; + } + + + private void saveData() { + try (FileOutputStream fos = new FileOutputStream(filePath); + ObjectOutputStream oos = new ObjectOutputStream(fos)) { + oos.writeObject(data); + } catch (IOException e) { + System.out.println(ErrorMessages.format("[ReadStatus]", ErrorMessages.ERROR_SAVE)); + e.printStackTrace(); + } + } + + // 불러오기 메서드 + @SuppressWarnings("unchecked") + private Map loadData() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + System.out.println(ErrorMessages.format("[ReadStatus]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); + } catch (IOException | ClassNotFoundException e) { + System.out.println(ErrorMessages.format("[ReadStatus]", ErrorMessages.ERROR_LOAD)); + e.printStackTrace(); + } + // 실패 시 빈 Map 반환 + return new HashMap<>(); + } +} 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 efbd2799..e7965e7a 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 @@ -1,59 +1,69 @@ package com.sprint.mission.discodeit.repository.file; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.UserRepository; - -import static com.sprint.mission.discodeit.util.DataInitializer.*; +import jakarta.annotation.PostConstruct; import java.io.*; import java.util.*; -import java.util.stream.Collectors; - -public class FileUserRepository implements UserRepository { - private static final long serialVersionUID = 1L; - private final String FILE_PATH = USER_FILE_PATH; +public class FileUserRepository implements UserRepository { + private final String filePath; private ChannelRepository channelRepository; + private Map data; - private Map data = loadData(); - - public FileUserRepository(ChannelRepository channelRepository) { + public FileUserRepository(DiscodeitProperties properties, ChannelRepository channelRepository) { + if (properties.getFilePath() == null) { + System.out.println(ErrorMessages.format("[User]", ErrorMessages.ERROR_FILE_PATH_NULL)); + } + this.filePath = properties.getFilePath() + "/user.ser"; this.channelRepository = channelRepository; + this.data = new HashMap<>(); + } + + // 파일 있으면 불러오기 + @PostConstruct + public void init() { + this.data = loadData(); } @Override - public void create(User user) { + public User create(User user) { this.data.put(user.getId(), user); saveData(); + return user; } //유저 아이디 조회 @Override - public User read(UUID id) { - return this.data.get(id); + public Optional find(UUID id) { + return Optional.ofNullable(this.data.get(id)); } //유저 이름으로 조회 @Override - public List readByName(String name) { + public Optional findByUserName(String name) { return data.values().stream() - .filter(user -> user.getName().contains(name)) - .collect(Collectors.toList()); + .filter(user -> Objects.equals(user.getName(), name)) + .findFirst(); } //유저 전체 조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(data.values()); } //유저 수정 @Override - public User update(UUID id, User update) { - User user = this.data.get(id); + public User update(User update) { + User user = this.data.get(update.getId()); user.update(update); + saveData(); return user; } @@ -64,11 +74,11 @@ public boolean delete(UUID id) { } private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); + try (FileOutputStream fos = new FileOutputStream(filePath); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(data); } catch (IOException e) { - System.err.println("[유저] 데이터 저장 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[User]", ErrorMessages.ERROR_SAVE)); e.printStackTrace(); } } @@ -76,12 +86,14 @@ private void saveData() { // 불러오기 메서드 @SuppressWarnings("unchecked") private Map loadData() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { return (Map) ois.readObject(); } catch (FileNotFoundException e) { - System.out.println("[유저] 저장된 파일이 없습니다. 새 데이터를 시작합니다."); + System.out.println(ErrorMessages.format("[User]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); } catch (IOException | ClassNotFoundException e) { - System.out.println("[유저] 데이터 불러오기 중 오류 발생: " + e.getMessage()); + System.out.println(ErrorMessages.format("[User]", ErrorMessages.ERROR_LOAD)); + e.printStackTrace(); } // 실패 시 빈 Map 반환 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..35af6dd0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -0,0 +1,109 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.config.DiscodeitProperties; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import jakarta.annotation.PostConstruct; + +import java.io.*; +import java.util.*; + + +public class FileUserStatusRepository implements UserStatusRepository { + private final String filePath; + private Map data; + + public FileUserStatusRepository(DiscodeitProperties properties) { + if (properties.getFilePath() == null) { + System.out.println(ErrorMessages.format("[UserStatus]", ErrorMessages.ERROR_FILE_PATH_NULL)); + } + this.filePath = properties.getFilePath() + "/userstatus.ser"; + this.data = new HashMap<>(); + } + + // 파일 있으면 불러오기 + @PostConstruct + public void init() { + this.data = loadData(); + } + + @Override + public UserStatus create(UserStatus userstatus) { + data.put(userstatus.getUserId(), userstatus); + saveData(); + return userstatus; + } + + @Override + public UserStatus find(UUID id) { + return this.data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public Optional findByUserId(UUID userId) { + return data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .findFirst(); + } + + @Override + public UserStatus update(UserStatus update) { + UserStatus userStatus = data.get(update.getUserId()); + userStatus.updateOnlineStatus(userStatus.isOnline()); + userStatus.updatelastOnline();; + saveData(); + return update; + } + + @Override + public boolean delete(UUID id) { + return data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .map(UserStatus::getUserId) + .toList(); + + boolean deleted = false; + for(UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + saveData(); + return deleted; + } + + private void saveData() { + try (FileOutputStream fos = new FileOutputStream(filePath); + ObjectOutputStream oos = new ObjectOutputStream(fos)) { + oos.writeObject(data); + } catch (IOException e) { + System.out.println(ErrorMessages.format("[UserStatus]", ErrorMessages.ERROR_SAVE)); + e.printStackTrace(); + } + } + + // 불러오기 메서드 + @SuppressWarnings("unchecked") + private Map loadData() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (FileNotFoundException e) { + System.out.println(ErrorMessages.format("[UserStatus]", ErrorMessages.ERROR_NOT_FOUND)); + System.out.println("새 데이터를 시작합니다."); + } catch (IOException | ClassNotFoundException e) { + System.out.println(ErrorMessages.format("[UserStatus]", ErrorMessages.ERROR_LOAD)); + e.printStackTrace(); + } + // 실패 시 빈 Map 반환 + return new HashMap<>(); + } +} 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..234e7e7b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -0,0 +1,76 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.dto.request.create.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; + +import java.util.*; +import java.util.stream.Collectors; + +public class JCFBinaryContentRepository implements BinaryContentRepository { + private final Map data = new HashMap<>(); + + @Override + public BinaryContent save(BinaryContent binaryContent) { + BinaryContent content = new BinaryContent( + binaryContent.getUserId(), + binaryContent.getMessageId(), + binaryContent.getContent(), + binaryContent.getContentType(), + binaryContent.getOriginalFilename() + ); + data.put(content.getId(), content); + + return content; + } + + @Override + public BinaryContent find(UUID id) { + return data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public List findByUserId(UUID userId) { + return data.values().stream() + .filter(binaryContent -> binaryContent.getUserId().equals(userId)) + .collect(Collectors.toList()); + } + + @Override + public boolean delete(UUID id) { + return this.data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getUserId(), userId)) + .map(BinaryContent::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + return deleted; + } + + @Override + public boolean deleteByMessageId(UUID messageId) { + List toRemove = data.values().stream() + .filter(file -> Objects.equals(file.getMessageId(), messageId)) + .map(BinaryContent::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + return deleted; + } +} 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 8699b593..e3ca995d 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 @@ -13,24 +13,25 @@ public class JCFChannelRepository implements ChannelRepository { //채널 생성 @Override - public void create(Channel channel) { + public Channel create(Channel channel) { data.put(channel.getId(), channel); + return channel; } //채널 조회 @Override - public Channel read(UUID id) { - return data.get(id); + public Optional find(UUID id) { + return Optional.ofNullable(this.data.get(id)); } //채널 전체 조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(data.values()); } //특정 채널 정보 - public List readByName(String channelName) { + public List findByChannelName(String channelName) { return data.values().stream() .filter(channel -> channel.getChannelName().contains(channelName)) .collect(Collectors.toList()); @@ -46,7 +47,7 @@ public Channel update(UUID id, Channel update) { //채널 삭제 @Override - public boolean delete(UUID id, User user, String password) { + public boolean delete(UUID id, UUID userId, String password) { return this.data.remove(id) != null; } 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 a8cac7e2..de1e861e 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,6 +3,7 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import java.time.Instant; import java.util.*; public class JCFMessageRepository implements MessageRepository { @@ -10,19 +11,20 @@ public class JCFMessageRepository implements MessageRepository { //메시지 생성 @Override - public void create(Message message) { + public Message create(Message message) { data.put(message.getId(), message); + return message; } //메시지 조회 @Override - public Message read(UUID id) { + public Message find(UUID id) { return this.data.get(id); } //메시지 전체조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(this.data.values()); } @@ -30,7 +32,7 @@ public List readAll() { @Override public Message update(UUID id, Message update) { Message selected = this.data.get(id); - selected.update(update); + selected.update(update.getContent()); return selected; } @@ -40,4 +42,26 @@ public boolean delete(UUID id) { return data.remove(id) != null; } + @Override + public Optional findLastMessageTimeByChannelId(UUID channelId) { + return data.values().stream() + .filter(msg -> Objects.equals(msg.getChannelId(), channelId)) + .map(Message::getCreatedAt) + .max(Comparator.naturalOrder()); + } + + @Override + public boolean deleteByChannelId(UUID channelId) { + List toRemove = data.values().stream() + .filter(message -> Objects.equals(message.getChannelId(), channelId)) + .map(Message::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + + return deleted; + } } 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..f06e45e8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -0,0 +1,81 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; + +import java.util.*; + + +public class JCFReadStatusRepository implements ReadStatusRepository { + private final Map data = new HashMap<>(); + + @Override + public ReadStatus create(ReadStatus readStatus) { + this.data.put(readStatus.getId(), readStatus); + return readStatus; + } + + @Override + public ReadStatus find(UUID id) { + return this.data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public List findByUserId(UUID userId) { + return data.values().stream() + .filter(readStatus -> Objects.equals(readStatus.getUserId(), userId)) + .toList(); + } + + @Override + public List findByChannelId(UUID channelId) { + return data.values().stream() + .filter(readStatus -> Objects.equals(readStatus.getChannelId(), channelId)) + .toList(); + } + + @Override + public ReadStatus update(ReadStatus update) { + ReadStatus readStatus = this.data.get(update.getId()); + readStatus.updateLastReadTime(update.getLastReadTime()); + return update; + } + + @Override + public boolean delete(UUID id) { + return data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + List toRemove = data.values().stream() + .filter(readStatus -> Objects.equals(readStatus.getUserId(), userId)) + .map(ReadStatus::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + return deleted; + } + + @Override + public boolean deleteByChannelId(UUID channelId) { + List toRemove = data.values().stream() + .filter(readStatus -> Objects.equals(readStatus.getChannelId(), channelId)) + .map(ReadStatus::getId) + .toList(); + + boolean deleted = false; + for (UUID id : toRemove) { + deleted |= data.remove(id) != null; + } + return deleted; + } +} 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 3735e977..db746c91 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,44 +3,42 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; - import java.util.*; -import java.util.stream.Collectors; public class JCFUserRepository implements UserRepository { private final Map data = new HashMap<>(); //유저 생성 @Override - public void create(User user) { + public User create(User user) { this.data.put(user.getId(), user); + return user; } //유저 아이디 조회 @Override - public User read(UUID id) { - return this.data.get(id); + public Optional find(UUID id) { + return Optional.ofNullable(this.data.get(id)); } //유저 이름으로 조회 @Override - public List readByName(String name) { - List result = data.values().stream() - .filter(user -> user.getName().contains(name)) - .collect(Collectors.toList()); - return result; + public Optional findByUserName(String name) { + return data.values().stream() + .filter(user -> Objects.equals(user.getName(), name)) + .findFirst(); } //유저 전체 조회 @Override - public List readAll() { + public List findAll() { return new ArrayList<>(data.values()); } //유저 수정 @Override - public User update(UUID id, User update) { - User user = this.data.get(id); + public User update(User update) { + User user = this.data.get(update.getId()); user.update(update); return user; } 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..3ce7e0a7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -0,0 +1,51 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; + +import java.util.*; + +public class JCFUserStatusRepository implements UserStatusRepository { + private final Map data = new HashMap<>(); + + @Override + public UserStatus create(UserStatus userstatus) { + this.data.put(userstatus.getUserId(), userstatus); + return userstatus; + } + + @Override + public UserStatus find(UUID id) { + return this.data.get(id); + } + + @Override + public List findAll() { + return new ArrayList<>(data.values()); + } + + @Override + public Optional findByUserId(UUID userId) { + return data.values().stream() + .filter(userStatus -> Objects.equals(userStatus.getUserId(), userId)) + .findFirst(); + } + + @Override + public UserStatus update(UserStatus update) { + UserStatus userStatus = this.data.get(update.getUserId()); + userStatus.updateOnlineStatus(update.isOnline()); + userStatus.updatelastOnline(); + return userStatus; + } + + @Override + public boolean delete(UUID id) { + return data.remove(id) != null; + } + + @Override + public boolean deleteByUserId(UUID userId) { + return data.remove(userId) != null; + } +} 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..ce9d93b8 --- /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.request.LoginRequest; +import com.sprint.mission.discodeit.entity.User; + +public interface AuthService { + User login(LoginRequest 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..82f9f111 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.Response.BinaryContentResponse; +import com.sprint.mission.discodeit.dto.request.create.BinaryContentCreateRequest; + +import java.util.List; +import java.util.UUID; + +public interface BinaryContentService { + public BinaryContentResponse create(BinaryContentCreateRequest request); + + public BinaryContentResponse find(UUID id); + + public List findAllByIdIn(List ids); + + public boolean 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 92dfcc17..a908664e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,22 +1,29 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.dto.Response.ChannelResponse; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_private; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_public; +import com.sprint.mission.discodeit.dto.request.update.ChannelUpdateRequest; import com.sprint.mission.discodeit.entity.User; -import java.util.*; +import java.util.List; +import java.util.Set; +import java.util.UUID; public interface ChannelService { - public void create(Channel channel); + public ChannelResponse createPublicChannel(ChannelCreateRequest_public request); - public Channel read(UUID id); + public ChannelResponse createPrivateChannel(ChannelCreateRequest_private request); - public List readAll(); + public ChannelResponse find(UUID id); - public List readByName(String channelName); + public List findAllByUserId(UUID id); - public Channel update(UUID id, Channel update); + public List findByChannelName(String channelName); - public boolean delete(UUID id, User user, String password); + public ChannelResponse update(ChannelUpdateRequest request); + + public boolean delete(UUID id, UUID userId, String password); public Set members(UUID id); 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 4f231390..9e1e7241 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,18 +1,20 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.dto.request.create.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.Response.MessageResponse; +import com.sprint.mission.discodeit.dto.request.update.MessageUpdateRequest; import java.util.*; public interface MessageService { - public void create(Message message); + public MessageResponse create(MessageCreateRequest request); - public Message read(UUID id); + public MessageResponse find(UUID id); - public List readAll(); + public List findAllByChannelId(UUID channelId); - public Message update(UUID id, Message update); + public MessageResponse update(MessageUpdateRequest request); public boolean delete(UUID id); 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..7ba87afd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -0,0 +1,20 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.request.create.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.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 id); + + public List findAllByUserId(UUID userId); + + public ReadStatus update(ReadStatusUpdateRequest request); + + public boolean delete(UUID id); +} 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 05f894e8..736c3e37 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,27 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.request.create.UserCreateRequest; +import com.sprint.mission.discodeit.dto.Response.UserResponse; +import com.sprint.mission.discodeit.dto.request.update.UserUpdateRequest; import com.sprint.mission.discodeit.entity.User; import java.util.*; public interface UserService { - public void create(User user); + public UserResponse create(UserCreateRequest request); - public User read(UUID id); + public UserResponse find(UUID id); - public List readByName(String name); + public UserResponse findByUserName(String name); - public List readAll(); + public List findAll(); - public User update(UUID id, User update); + public UserResponse update(UserUpdateRequest request); public boolean delete(UUID id, String password); public void removeUserFromChannels(User user); + public List findByUserNameKeyWords(String keyword); + } 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..293344b2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.Response.UserStatusResponse; +import com.sprint.mission.discodeit.dto.request.create.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.UserStatusUpdateRequest; + +import java.util.List; +import java.util.UUID; + +public interface UserStatusService { + public UserStatusResponse create(UserStatusCreateRequest request); + + public UserStatusResponse find(UUID id); + + public List findAll(); + + public UserStatusResponse update(UserStatusUpdateRequest request); + + public UserStatusResponse updateByUserId(UUID userId, UserStatusUpdateRequest request); + + public boolean delete(UUID 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..6c380575 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.AuthService; + +public class BasicAuthService implements AuthService { + private final UserRepository userRepository; + + public BasicAuthService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public User login(LoginRequest request) { + //1. Username으로 user 찾기 + User user = userRepository.findByUserName(request.userName()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("user", ErrorMessages.ERROR_NOT_FOUND))); + + //2. password 일치 여부 확인 + if (!user.getPassword().equals(request.password())) { + throw new IllegalArgumentException(ErrorMessages.format("password", ErrorMessages.ERROR_MISMATCH)); + } + return user; + } +} 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..76152f73 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -0,0 +1,73 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.Response.BinaryContentResponse; +import com.sprint.mission.discodeit.dto.request.create.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.service.BinaryContentService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class BasicBinaryContentService implements BinaryContentService { + public final BinaryContentRepository binaryContentRepository; + + @Override + public BinaryContentResponse create(BinaryContentCreateRequest request) { + if ((request.userId() == null && request.messageId() == null) + || request.content() == null || request.content().length == 0) { + throw new IllegalArgumentException( + ErrorMessages.format("binaryContent", ErrorMessages.ERROR_FILE_UPLOAD_INVALID)); + } + + BinaryContent file = new BinaryContent( + request.userId(), + request.messageId(), + request.content(), + request.contentType(), + request.originalFilename() + ); + + binaryContentRepository.save(file); + return toBinaryContentResponse(file); + } + + @Override + public BinaryContentResponse find(UUID id) { + BinaryContent file = binaryContentRepository.find(id); + if (file == null) { + throw new IllegalArgumentException( + ErrorMessages.format("BinaryContent", ErrorMessages.ERROR_NOT_FOUND)); + } + return toBinaryContentResponse(file); + } + + @Override + public List findAllByIdIn(List ids) { + return ids.stream() + .map(this::find) + .filter(Objects::nonNull) + .toList(); + } + + @Override + public boolean delete(UUID id) { + binaryContentRepository.delete(id); + return true; + } + + private BinaryContentResponse toBinaryContentResponse(BinaryContent file) { + return new BinaryContentResponse( + file.getId(), + file.getContentType(), + file.getOriginalFilename(), + file.getUrl() + ); + } +} 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 9bab5cfd..691beef8 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,64 +1,199 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_private; +import com.sprint.mission.discodeit.dto.request.create.ChannelCreateRequest_public; +import com.sprint.mission.discodeit.dto.Response.ChannelResponse; +import com.sprint.mission.discodeit.dto.request.update.ChannelUpdateRequest; import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.entity.User; 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.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.*; +@Service +@RequiredArgsConstructor public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; + private final UserRepository userRepository; + private final ReadStatusRepository readStatusRepository; + private final MessageRepository messageRepository; - public BasicChannelService(ChannelRepository channelRepository) { - this.channelRepository = channelRepository; + //private 채널생성 + @Override + public ChannelResponse createPrivateChannel(ChannelCreateRequest_private request) { + //creatorId로 유저조회 + User creator = userRepository.find(request.creatorId()).orElseThrow(); + + //memberIds로 멤버 조회 + Set members = new HashSet<>(); + for(UUID memberId : request.memberIds()) { + members.add(findUserById(memberId)); + } + + Channel channel = new Channel( + "", + creator, + new ArrayList<>(), + members, + true); + + Channel savedChannel = channelRepository.create(channel); + + for(User member : members) { + ReadStatus readStatus = new ReadStatus( + member.getId(), + savedChannel.getId(), + Instant.now() + ); + readStatusRepository.create(readStatus); + } + + //참여자 id추출 + List memberIds = readStatusRepository.findByChannelId(savedChannel.getId()).stream() + .map(ReadStatus::getUserId).toList(); + + return toChannelResponse(savedChannel, lastMessageTime(savedChannel.getId()), memberIds); } + //public 채널생성 @Override - public void create(Channel channel) { + public ChannelResponse createPublicChannel(ChannelCreateRequest_public request) { + User creator = userRepository.find(request.creatorId()).orElseThrow(); + + Set members = new HashSet<>(); + for(UUID memberId : request.memberIds()) { + members.add(findUserById(memberId)); + } + + Channel channel = new Channel( + request.channelName(), + creator, + request.categories(), + members, + false + ); + validateDuplicateChannelName(channel); channel.validateUniqueCategory(); - channel.addKeyUserToMembers(); - channelRepository.create(channel); + channel.addCreatorToMembers(); + + Channel savedChannel = channelRepository.create(channel); + + return toChannelResponse(savedChannel, lastMessageTime(savedChannel.getId()), List.of()); } @Override - public Channel read(UUID id) { - Channel channel = channelRepository.read(id); + public ChannelResponse find(UUID channelId) { + Channel channel = channelRepository.find(channelId).orElseThrow(); if (channel == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); } - return channel; + + List memberIds = new ArrayList<>(); + if (channel.isPrivate()) { + List readStatuses = readStatusRepository.findByChannelId(channelId); + for (ReadStatus readStatus : readStatuses) { + memberIds.add(readStatus.getUserId()); + } + } + + return toChannelResponse(channel, lastMessageTime(channel.getId()), memberIds); } + /* + * 1. 저장소에서 전체 채널 불러오기 + * 2. 응답리스트 생성 + * 3. 채널 순회 하며 필터링(Private, Public) + * 4. 반환*/ @Override - public List readAll() { - return channelRepository.readAll(); + public List findAllByUserId(UUID userId) { + List channels = channelRepository.findAll(); + List responses = new ArrayList<>(); + + for (Channel channel : channels) { + if(channel.isPrivate()) { + processPrivateChannel(channel, userId, responses); + } else { + processPublicChannel(channel, responses); + } + } + return responses; } @Override - public List readByName(String channelName) { - return channelRepository.readByName(channelName); + public List findByChannelName(String channelName) { + List channels = channelRepository.findByChannelName(channelName); + if (channels.isEmpty()) { + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); + + } + + List responses = new ArrayList<>(); + + for (Channel channel : channels) { + List memberIds = channel.isPrivate() + ? readStatusRepository.findByChannelId(channel.getId()).stream() + .map(ReadStatus::getUserId).toList() + :List.of(); + if (channel.isPrivate()) { + List readStatuses = readStatusRepository.findByChannelId(channel.getId()); + for (ReadStatus readStatus : readStatuses) { + memberIds.add(readStatus.getUserId()); + } + } + responses.add(toChannelResponse(channel, lastMessageTime(channel.getId()), memberIds)); + } + return responses; } @Override - public Channel update(UUID id, Channel update) { - Channel channel = channelRepository.read(id); + public ChannelResponse update(ChannelUpdateRequest request) { + Channel channel = channelRepository.find(request.channelId()).orElseThrow(); if (channel == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); + } + if(channel.isPrivate()) { + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_PRIVATE_CHANNEL_NOT_UPDATE)); } - channel.update(update); - return channel; + + channel.update(request.newChannelName(), request.newCategories()); + User newCreator = findUserById(request.newKeyUserId()); + channel.setCreator(newCreator); + + List memberIds = List.of(); + + return toChannelResponse(channel, lastMessageTime(channel.getId()), memberIds); } @Override - public boolean delete(UUID id, User user, String password) { - Channel channel = channelRepository.read(id); - if (channel == null) { - throw new IllegalArgumentException(" --해당 채널을 찾을 수 없습니다."); + public boolean delete(UUID id, UUID userId, String password) { + Channel channel = channelRepository.find(id) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND))); + + if (!channel.getCreator().getPassword().equals(password)) { + throw new IllegalArgumentException( + ErrorMessages.format("password", ErrorMessages.ERROR_MISMATCH) + ); } - return channelRepository.delete(id, user, password); + + messageRepository.deleteByChannelId(id); + readStatusRepository.deleteByChannelId(id); + + return channelRepository.delete(id, userId, password); } @Override @@ -67,10 +202,58 @@ public Set members(UUID id) { } private void validateDuplicateChannelName(Channel channel) { - List channels = channelRepository.readByName(channel.getChannelName()); - if (channels.stream().anyMatch(c -> c.getKeyUser().equals(channel.getKeyUser()) + List channels = channelRepository.findByChannelName(channel.getChannelName()); + if (channels.stream().anyMatch(c -> c.getCreator().equals(channel.getCreator()) && c.getChannelName().equals(channel.getChannelName()))) { - throw new IllegalArgumentException(" --- 이미 등록된 채널입니다."); + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); } } + + private User findUserById(UUID userId) { + User user = userRepository.find(userId) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND))); + return user; + } + + private Instant lastMessageTime(UUID channelId) { + return messageRepository.findLastMessageTimeByChannelId(channelId) + .orElse(null); + } + + private void processPrivateChannel(Channel channel, UUID userId, List responses) { + List readStatuses = readStatusRepository.findByChannelId(channel.getId()); + + // 해당 유저가 참여자인지 + boolean isMember = readStatuses.stream() + .anyMatch(readStatus -> readStatus.getUserId().equals(userId)); + + //아니라면 조회 대상제외 + if(!isMember) return; + + //참여자 id리스트 + List memberIds = readStatuses.stream() + .map(ReadStatus::getUserId) + .toList(); + + responses.add(toChannelResponse(channel, lastMessageTime(channel.getId()), memberIds)); + } + + public void processPublicChannel(Channel channel, List responses) { + // Public 채널은 멤버 리스트 없이 응답 + responses.add(toChannelResponse(channel, lastMessageTime(channel.getId()), List.of())); + } + + private ChannelResponse toChannelResponse(Channel channel, Instant lastMessageTime, List memberIds) { + return new ChannelResponse( + channel.getId(), + channel.getChannelName(), + channel.getCategories(), + channel.isPrivate(), + lastMessageTime, + memberIds, + channel.getCreator().getId() + ); + } } 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 3db3b2f3..5155fe34 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,60 +1,178 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.Response.BinaryContentResponse; +import com.sprint.mission.discodeit.dto.Response.MessageResponse; +import com.sprint.mission.discodeit.dto.request.BinaryContentRequest; +import com.sprint.mission.discodeit.dto.request.create.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.MessageUpdateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicMessageService implements MessageService { private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelRepository channelRepository; - - public BasicMessageService(MessageRepository messageRepository, UserRepository userRepository, ChannelRepository channelRepository) { - this.messageRepository = messageRepository; - this.userRepository = userRepository; - this.channelRepository = channelRepository; - } + private final BinaryContentRepository binaryContentRepository; @Override - public void create(Message message) { - Channel channel = message.getChannel(); - channel.validateCategory(message.getCategory()); - channel.validateMembership(message.getSender()); + public MessageResponse create(MessageCreateRequest request) { + + User sender = userRepository.find(request.senderId()).orElseThrow(); + Channel channel = channelRepository.find(request.channelId()).orElseThrow(); + + if(channel == null) { + System.out.println(ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); + } + + Message message = new Message( + sender.getId(), + channel.getId(), + request.category(), + request.content() + ); + + channel.validateCategory(request.category()); + channel.validateMembership(sender); message.validateContent(); - messageRepository.create(message); + + Message savedMessage = messageRepository.create(message); + + List savedAttachments = new ArrayList<>(); + if(request.attachments() != null && !request.attachments().isEmpty()) { + for(BinaryContentRequest file : request.attachments()) { + BinaryContent attachment = new BinaryContent( + null, + savedMessage.getId(), + file.content(), + file.contentType(), + file.originalFilename() + ); + savedAttachments.add(binaryContentRepository.save(attachment)); + } + } + + return toMessageResponse(savedMessage, savedAttachments, sender.getName()); } @Override - public Message read(UUID id) { - Message message = messageRepository.read(id); + public MessageResponse find(UUID id) { + Message message = messageRepository.find(id); if (message == null) { - throw new IllegalArgumentException(" --해당 메시지를 찾을 수 없습니다."); + System.out.println(ErrorMessages.format("Message", ErrorMessages.ERROR_NOT_FOUND)); } - return message; + + User sender= userRepository.find(message.getSenderId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND))); + + List attachmemts = binaryContentRepository.findAll().stream() + .filter(file -> file.getMessageId().equals(message.getId())) + .toList(); + + return toMessageResponse(message, attachmemts, sender.getName()); } @Override - public List readAll() { - return messageRepository.readAll(); + public List findAllByChannelId(UUID channelId) { + Channel channel = channelRepository.find(channelId).orElseThrow(); + if(channel == null) { + throw new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND)); + } + + List messages = messageRepository.findAll().stream() + .filter(msg -> msg.getChannelId().equals(channelId)) + .sorted(Comparator.comparing(Message::getCreatedAt)) + .toList(); + + List responses = new ArrayList<>(); + + for (Message message : messages) { + User sender = userRepository.find(message.getSenderId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("Seder", ErrorMessages.ERROR_NOT_FOUND) + )); + + List attachments = binaryContentRepository.findAll().stream() + .filter(file -> file.getMessageId().equals(message.getId())) + .toList(); + + responses.add(toMessageResponse(message, attachments, sender.getName())); + } + return responses; } @Override - public Message update(UUID id, Message update) { - return messageRepository.update(id, update); + public MessageResponse update(MessageUpdateRequest request) { + Message message = messageRepository.find(request.messageId()); + if(message == null) { + throw new IllegalArgumentException( + ErrorMessages.format("Message", ErrorMessages.ERROR_NOT_FOUND)); + } + + message.update(request.newContent()); + + Message updatedMessage = messageRepository.update(request.messageId(), message); + + User sender = userRepository.find(updatedMessage.getSenderId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("Sender", ErrorMessages.ERROR_NOT_FOUND) + )); + + List attachments = binaryContentRepository.findAll().stream() + .filter(file -> file.getMessageId().equals(updatedMessage.getId())) + .toList(); + + return toMessageResponse(updatedMessage, attachments, sender.getName()); } @Override - public boolean delete(UUID id) { - Message message = messageRepository.read(id); + public boolean delete(UUID messageId) { + Message message = messageRepository.find(messageId); if (message == null) { - throw new IllegalArgumentException(" --해당 메시지를 찾을 수 없습니다."); + throw new IllegalArgumentException( + ErrorMessages.format("Message", ErrorMessages.ERROR_NOT_FOUND)); } - return messageRepository.delete(id); + + //첨부파일 삭제 + binaryContentRepository.deleteByMessageId(messageId); + + //메시지 삭제 + return messageRepository.delete(messageId); + } + + private MessageResponse toMessageResponse(Message message, List attachments, String senderName) { + List attachmentsDtos = attachments.stream() + .map(file -> new BinaryContentResponse( + file.getId(), + file.getContentType(), + file.getOriginalFilename(), + file.getUrl() + )).toList(); + + return new MessageResponse( + message.getId(), + message.getContent(), + senderName, + message.getCreatedAt(), + attachmentsDtos + ); } } 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..d47e297d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -0,0 +1,98 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.request.create.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.ReadStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.entity.User; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class BasicReadStatusService implements ReadStatusService { + public final UserRepository userRepository; + public final ChannelRepository channelRepository; + public final ReadStatusRepository readStatusRepository; + + @Override + public ReadStatus create(ReadStatusCreateRequest request) { + User user = userRepository.find(request.userId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND) + )); + + Channel channel = channelRepository.find(request.channelId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("Channel", ErrorMessages.ERROR_NOT_FOUND) + )); + + + //가장 최근에 읽은 시간 하나만 두기위해 중복 체크 + boolean alreadyExists = readStatusRepository.findByUserId(request.userId()).stream() + .anyMatch(rs -> rs.getChannelId().equals(request.channelId())); + + if (alreadyExists) { + throw new IllegalStateException( + ErrorMessages.format("Message", ErrorMessages.ERROR_EXISTS) + ); + } + + ReadStatus readStatus = new ReadStatus( + request.userId(), + request.channelId(), + request.lastReadTime() + ); + + readStatusRepository.create(readStatus); + return readStatus; + } + + @Override + public ReadStatus find(UUID id) { + ReadStatus readStatus = readStatusRepository.find(id); + if (readStatus == null) { + throw new IllegalArgumentException( + ErrorMessages.format("ReadStatus", ErrorMessages.ERROR_NOT_FOUND)); + } + return readStatus; + } + + @Override + public List findAllByUserId(UUID userId) { + return readStatusRepository.findByUserId(userId); + } + + @Override + public ReadStatus update(ReadStatusUpdateRequest request) { + ReadStatus readStatus = readStatusRepository.find(request.id()); + if (readStatus == null) { + throw new IllegalArgumentException( + ErrorMessages.format("ReadStatus", ErrorMessages.ERROR_NOT_FOUND) + ); + } + + readStatus.setLastReadTime(request.newReadTime()); + return readStatusRepository.update(readStatus); + } + + @Override + public boolean delete(UUID id) { + ReadStatus readStatus = readStatusRepository.find(id); + if (readStatus == null) { + throw new IllegalArgumentException( + ErrorMessages.format("ReadStatus", ErrorMessages.ERROR_NOT_FOUND) + ); + } + readStatusRepository.delete(id); + return true; + } +} 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 0bad1511..62d0565b 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,72 +1,174 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.Response.UserResponse; +import com.sprint.mission.discodeit.dto.request.create.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.UserUpdateRequest; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Channel; 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.ChannelRepository; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; -import java.util.*; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +@Service +@RequiredArgsConstructor public class BasicUserService implements UserService { + private final ChannelRepository channelRepository; private final UserRepository userRepository; + private final UserStatusRepository userStatusRepository; + private final BinaryContentRepository binaryContentRepository; - public BasicUserService(ChannelRepository channelRepository, UserRepository userRepository) { - this.channelRepository = channelRepository; - this.userRepository = userRepository; - } + public UserResponse create(UserCreateRequest request) { + // 중복 name, email 검사 + existsByUserName(request.name()); + existsByEmail(request.email()); - @Override - public void create(User user) { - validateDuplicateEmail(user); - userRepository.create(user); + User user = new User(request.name(), request.email(), request.phone(), request.password()); + User savedUser = userRepository.create(user); + + //프로필 이미지 생성 + if (request.profileImage() != null && request.profileImage().content() != null && request.profileImage().content().length > 0) { + BinaryContent profileImage = new BinaryContent( + savedUser.getId(), + null, + request.profileImage().content(), + request.profileImage().contentType(), + request.profileImage().originalFilename() + ); + BinaryContent savedImage = binaryContentRepository.save(profileImage); + user.setProfileImageId(savedImage.getId()); + userRepository.update(user); + } + + UserStatus status = new UserStatus(savedUser.getId(), false); + userStatusRepository.create(status); + + return toUserResponse(savedUser, status); } @Override - public User read(UUID id) { - User user = userRepository.read(id); - if (user == null) { - throw new IllegalArgumentException(" --해당 유저를 찾을 수 없습니다."); - } - return user; + public UserResponse find(UUID userId) { + User user = userRepository.find(userId).orElseThrow(); + + UserStatus status = userStatusRepository.findByUserId(userId) + .orElse(new UserStatus(userId, false)); + + return toUserResponse(user, status); } @Override - public List readAll() { - return userRepository.readAll(); + public List findAll() { + List users = userRepository.findAll(); + + return users.stream() + .map(user -> { + UserStatus status = + userStatusRepository.findByUserId(user.getId()) + .orElse(new UserStatus(user.getId(), false)); + return toUserResponse(user,status); + }) + .collect(Collectors.toList()); } @Override - public List readByName(String name) { - return userRepository.readByName(name); + public UserResponse findByUserName(String name) { + User user = userRepository.findByUserName(name) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND))); + + UserStatus status = userStatusRepository.findByUserId(user.getId()) + .orElse(new UserStatus(user.getId(), false)); + + return toUserResponse(user, status); } @Override - public User update(UUID id, User update) { - User user = userRepository.read(id); - if (user == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); + public UserResponse update(UserUpdateRequest request) { + //1. 수정할 엔티티 조회 + User user = userRepository.find(request.id()).orElseThrow(); + + //2. username/email 변경 시 중복 체크 + if (request.username() != null && !request.username().equals(user.getName())) { + existsByUserName(request.username()); + } + + if(request.email() != null && !request.email().equals(user.getEmail())) { + existsByEmail(request.email()); + } + + //3. 변경할 값 있으면 반영 + if(request.username() != null) user.setName(request.username()); + if(request.email() != null ) user.setEmail(request.email()); + if(request.password() != null) user.setPassword(request.password()); + if(request.phone() != null) user.setPhone(request.phone()); + + //4. 프로필 이미지 대체( 있으면 새로 저장) + if (request.profileImage() != null && !request.profileImage().isEmpty()) { + try { + BinaryContent binaryContent = new BinaryContent( + user.getId(), + null, + request.profileImage().getBytes(), + request.profileImage().getContentType(), + request.profileImage().getOriginalFilename() + ); + + binaryContentRepository.save(binaryContent); + user.setProfileImageId(binaryContent.getId()); + + } catch (IOException e) { + throw new RuntimeException( + ErrorMessages.format("ProfileImage", ErrorMessages.ERROR_SAVE)); + } } - user.update(update); - return user; + + //5. 변경된 User 엔티티 저장 + userRepository.create(user); + + //6. UserStatus 조회 ( 없으면 기본값) + UserStatus status = userStatusRepository.findByUserId(user.getId()) + .orElse(new UserStatus(user.getId(), false)); + + //dto로 변환해서 반환 + return toUserResponse(user, status); } @Override - public boolean delete(UUID id, String password) { - User user = userRepository.read(id); + public boolean delete(UUID userId, String password) { + User user = userRepository.find(userId).orElseThrow(); if (user == null) { - throw new IllegalArgumentException(" --해당 유저를 찾을 수 없습니다."); + throw new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND) + ); } if (!user.getPassword().equals(password)) { - System.out.println("!!유저 탈퇴 실패!! --- 비밀번호 불일치"); + System.out.println( + ErrorMessages.format("User", ErrorMessages.ERROR_MISMATCH)); return false; } - boolean deleted = userRepository.delete(id); + boolean deleted = userRepository.delete(userId); if (deleted) { removeUserFromChannels(user); + binaryContentRepository.deleteByUserId(userId); + userStatusRepository.deleteByUserId(userId); + + userRepository.delete(userId); System.out.println("유저 탈퇴 성공"); } return deleted; @@ -74,7 +176,7 @@ public boolean delete(UUID id, String password) { @Override public void removeUserFromChannels(User user) { - for (Channel channel : channelRepository.readAll()) { + for (Channel channel : channelRepository.findAll()) { Set members = new HashSet<>(channel.getMembers()); if (members.remove(user)) { channel.setMembers(members); @@ -84,12 +186,47 @@ public void removeUserFromChannels(User user) { } } - private void validateDuplicateEmail(User user) { - List users = userRepository.readAll(); + private void existsByEmail(String email) { + List users = userRepository.findAll(); boolean exists = users.stream() - .anyMatch((u -> u.getEmail().equals(user.getEmail()))); + .anyMatch((u -> u.getEmail().equals(email))); if(exists) { - throw new IllegalArgumentException(" --- 이미 등록된 이메일입니다."); + throw new IllegalArgumentException( + ErrorMessages.format("Email", ErrorMessages.ERROR_EXISTS)); } } + + private void existsByUserName(String userName) { + List users = userRepository.findAll(); + boolean exists = users.stream() + .anyMatch((u -> u.getName().equals(userName))); + if(exists) { + throw new IllegalArgumentException( + ErrorMessages.format("UserName", ErrorMessages.ERROR_EXISTS)); + } + } + + private UserResponse toUserResponse(User user, UserStatus status) { + return new UserResponse( + user.getId(), + user.getName(), + user.getEmail(), + user.getPhone(), + user.getPassword(), + user.getProfileImageId(), + user.getProfileImageUrl(), + status.isOnline() + ); + } + + public List findByUserNameKeyWords(String keyword) { + return userRepository.findAll().stream() + .filter(user -> user.getName().contains(keyword)) + .map(user -> { + UserStatus status = userStatusRepository.findByUserId(user.getId()) + .orElse(new UserStatus(user.getId(), false)); + return toUserResponse(user, status); + }) + .toList(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java new file mode 100644 index 00000000..26e3bed9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -0,0 +1,109 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.common.ErrorMessages; +import com.sprint.mission.discodeit.dto.Response.UserStatusResponse; +import com.sprint.mission.discodeit.dto.request.create.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.update.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.User; +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 lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class BasicUserStatusService implements UserStatusService { + public final UserRepository userRepository; + public final UserStatusRepository userStatusRepository; + + + @Override + public UserStatusResponse create(UserStatusCreateRequest request) { + User user = userRepository.find(request.userId()) + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND)) + ); + + Optional existing = userStatusRepository.findByUserId(request.userId()); + if(existing.isPresent()) { + throw new IllegalArgumentException( + ErrorMessages.format("UserStatus", ErrorMessages.ERROR_EXISTS) + ); + } + + UserStatus status = new UserStatus(request.userId(), request.isOnline()); + userStatusRepository.create(status); + return toUserStatusResponse(status); + } + + @Override + public UserStatusResponse find(UUID id) { + UserStatus userStatus = userStatusRepository.find(id); + if(userStatus == null) { + throw new IllegalArgumentException( + ErrorMessages.format("User", ErrorMessages.ERROR_NOT_FOUND) + ); + } + return toUserStatusResponse(userStatus); + } + + @Override + public List findAll() { + return userStatusRepository.findAll().stream() + .map(this::toUserStatusResponse) + .toList(); + } + + @Override + public UserStatusResponse update(UserStatusUpdateRequest request) { + UserStatus userStatus = userStatusRepository.find(request.id()); + if(userStatus == null) { + throw new IllegalArgumentException( + ErrorMessages.format("UserStatus", ErrorMessages.ERROR_NOT_FOUND)); + } + + userStatus.updateOnlineStatus(request.newOnlineStatus()); + UserStatus updateUserStatus = userStatusRepository.update(userStatus); + return toUserStatusResponse(updateUserStatus); + } + + @Override + public UserStatusResponse updateByUserId(UUID userId, UserStatusUpdateRequest request) { + Optional optionalUserStatus = userStatusRepository.findByUserId(userId); + + if (optionalUserStatus.isEmpty()) { + throw new IllegalArgumentException( + ErrorMessages.format("UserStatus", ErrorMessages.ERROR_NOT_FOUND)); + } + + UserStatus userStatus = optionalUserStatus.get(); + userStatus.updateOnlineStatus(request.newOnlineStatus()); + UserStatus updateUserStatus = userStatusRepository.update(userStatus); + return toUserStatusResponse(updateUserStatus); + } + + @Override + public boolean delete(UUID id) { + UserStatus userStatus = userStatusRepository.find(id); + if(userStatus == null) { + throw new IllegalArgumentException(ErrorMessages.format( + "UserStatus", ErrorMessages.ERROR_NOT_FOUND)); + } + userStatusRepository.delete(id); + return true; + } + + private UserStatusResponse toUserStatusResponse(UserStatus status) { + return new UserStatusResponse( + status.getUserId(), + status.isOnline(), + status.getLastOnlineTime() + ); + } +} 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 index b316318c..e4cce545 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -1,133 +1,132 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.DataInitializer.*; - - -public class FileChannelService implements ChannelService { - private final String FILE_PATH = CHANNEL_FILE_PATH; - private Map data = loadData(); - - //채널 생성 - @Override - public void create(Channel channel) { - validateDuplicateChannelName(channel); - channel.validateUniqueCategory(); - channel.addKeyUserToMembers(); - - data.put(channel.getId(), channel); - saveData(); - } - - //채널 조회 - @Override - public Channel read(UUID id) { - Channel channel = this.data.get(id); - - if (channel == null) { //아무 객체도 가리키지 않음 - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - return channel; - } - - //특정 채널 정보 - @Override - public List readByName(String channelName) { - List result = data.values().stream() - .filter(channel -> channel.getChannelName().contains(channelName)) - .collect(Collectors.toList()); - - if (result.isEmpty()) { - throw new IllegalArgumentException("존재하지 않는 채널입니다."); - } - return result; - } - - //채널 전체 조회 - @Override - public List readAll() { - List channels = new ArrayList<>(data.values()); - - if (channels.isEmpty()) { //리스트있지만 요소없음 - System.out.println(" --조회 가능한 채널이 없습니다."); - } - - return channels; - } - - //채널 수정 - @Override - public Channel update(UUID id, Channel update) { - Channel channel = this.data.get(id); - - if (channel == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - channel.update(update); - return channel; - } - - //채널 삭제 - @Override - public boolean delete(UUID id, User user, String password) { - Channel channel = this.data.get(id); - if (!user.getPassword().equals(password)) { - System.out.println("!!채널 삭제 실패!! --- 비밀번호 불일치"); - return false; - } - System.out.println("<<채널 [" + channel.getChannelName() + "] 삭제 성공>>"); - return this.data.remove(id) != null; - } - - - //채널 멤버셋 - @Override - public Set members(UUID id) { - Channel channel = data.get(id); - return channel != null ? channel.getMembers() : Set.of(); - } - - //중복 채널명 검증 - private void validateDuplicateChannelName(Channel channel) { - for (Channel existingChannel : data.values()) { - if (existingChannel.getChannelName().equals(channel.getChannelName()) - && existingChannel.getKeyUser().equals(channel.getKeyUser())) { - throw new IllegalArgumentException(" --- "+ channel.getKeyUser().getName()+"님! 이미 등록된 채널입니다."); - } - } - } - - private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); - ObjectOutputStream oos = new ObjectOutputStream(fos)) { - oos.writeObject(data); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // 불러오기 메서드 - @SuppressWarnings("unchecked") - private Map loadData() { - try (FileInputStream fis = new FileInputStream(FILE_PATH); - ObjectInputStream ois = new ObjectInputStream(fis)) { - return (Map) ois.readObject(); - } catch (Exception e) { - e.printStackTrace(); - return new HashMap<>(); - } - } - -} +//package com.sprint.mission.discodeit.service.file; +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.User; +//import com.sprint.mission.discodeit.service.ChannelService; +// +//import java.io.FileInputStream; +//import java.io.FileOutputStream; +//import java.io.ObjectInputStream; +//import java.io.ObjectOutputStream; +//import java.util.*; +//import java.util.stream.Collectors; +// +//import static com.sprint.mission.discodeit.util.DataInitializer.*; +// +//public class FileChannelService implements ChannelService { +// private final String FILE_PATH = CHANNEL_FILE_PATH; +// private Map data = loadData(); +// +// //채널 생성 +// @Override +// public void create(Channel channel) { +// validateDuplicateChannelName(channel); +// channel.validateUniqueCategory(); +// channel.addKeyUserToMembers(); +// +// data.put(channel.getId(), channel); +// saveData(); +// } +// +// //채널 조회 +// @Override +// public Channel find(UUID id) { +// Channel channel = this.data.get(id); +// +// if (channel == null) { //아무 객체도 가리키지 않음 +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// return channel; +// } +// +// //특정 채널 정보 +// @Override +// public List findByChannelName(String channelName) { +// List result = data.values().stream() +// .filter(channel -> channel.getChannelName().contains(channelName)) +// .collect(Collectors.toList()); +// +// if (result.isEmpty()) { +// throw new IllegalArgumentException("존재하지 않는 채널입니다."); +// } +// return result; +// } +// +// //채널 전체 조회 +// @Override +// public List findAllByUserId() { +// List channels = new ArrayList<>(data.values()); +// +// if (channels.isEmpty()) { //리스트있지만 요소없음 +// System.out.println(" --조회 가능한 채널이 없습니다."); +// } +// +// return channels; +// } +// +// //채널 수정 +// @Override +// public Channel update(UUID id, Channel update) { +// Channel channel = this.data.get(id); +// +// if (channel == null) { +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// channel.update(update); +// return channel; +// } +// +// //채널 삭제 +// @Override +// public boolean delete(UUID id, User user, String password) { +// Channel channel = this.data.get(id); +// if (!user.getPassword().equals(password)) { +// System.out.println("!!채널 삭제 실패!! --- 비밀번호 불일치"); +// return false; +// } +// System.out.println("<<채널 [" + channel.getChannelName() + "] 삭제 성공>>"); +// return this.data.remove(id) != null; +// } +// +// +// //채널 멤버셋 +// @Override +// public Set members(UUID id) { +// Channel channel = data.get(id); +// return channel != null ? channel.getMembers() : Set.of(); +// } +// +// //중복 채널명 검증 +// private void validateDuplicateChannelName(Channel channel) { +// for (Channel existingChannel : data.values()) { +// if (existingChannel.getChannelName().equals(channel.getChannelName()) +// && existingChannel.getKeyUser().equals(channel.getKeyUser())) { +// throw new IllegalArgumentException(" --- "+ channel.getKeyUser().getName()+"님! 이미 등록된 채널입니다."); +// } +// } +// } +// +// private void saveData() { +// try (FileOutputStream fos = new FileOutputStream(FILE_PATH); +// ObjectOutputStream oos = new ObjectOutputStream(fos)) { +// oos.writeObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// // 불러오기 메서드 +// @SuppressWarnings("unchecked") +// private Map loadData() { +// try (FileInputStream fis = new FileInputStream(FILE_PATH); +// ObjectInputStream ois = new ObjectInputStream(fis)) { +// return (Map) ois.readObject(); +// } catch (Exception e) { +// e.printStackTrace(); +// return new HashMap<>(); +// } +// } +// +//} 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 index 96d2a590..c7d1064c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -1,89 +1,89 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.*; - -import static com.sprint.mission.discodeit.util.DataInitializer.*; - -public class FileMessageService implements MessageService { - private static final long serialVersionUID = 1L; - private final String FILE_PATH = MESSAGE_FILE_PATH; - - private final Map data = loadData(); - - private final UserService userService; - private final ChannelService channelService; - - public FileMessageService(UserService userService, ChannelService channelService) { - this.userService = userService; - this.channelService = channelService; - } - - //메시지 생성 - @Override - public void create(Message message) { - data.put(message.getId(), message); - saveData(); - } - - //메시지 조회 - @Override - public Message read(UUID id) { - Message message = this.data.get(id); - - //메시지id 존재하지 않음 - if (message == null) { - throw new IllegalArgumentException(" --해당 ID의 메시지를 찾을 수 없습니다."); - } - return this.data.get(id); - } - - //메시지 전체조회 - @Override - public List readAll() { - return new ArrayList<>(this.data.values()); - } - - //메시지 수정 - @Override - public Message update(UUID id, Message update) { - Message selected = this.data.get(id); - selected.update(update); - return selected; - } - - //메시지 삭제 - @Override - public boolean delete(UUID id) { - return data.remove(id) != null; - } - - private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); - ObjectOutputStream oos = new ObjectOutputStream(fos)) { - oos.writeObject(data); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // 불러오기 메서드 - @SuppressWarnings("unchecked") - private Map loadData() { - try (FileInputStream fis = new FileInputStream(FILE_PATH); - ObjectInputStream ois = new ObjectInputStream(fis)) { - return (Map) ois.readObject(); - } catch (Exception e) { - e.printStackTrace(); - return new HashMap<>(); - } - } -} +//package com.sprint.mission.discodeit.service.file; +// +//import com.sprint.mission.discodeit.entity.Message; +//import com.sprint.mission.discodeit.service.ChannelService; +//import com.sprint.mission.discodeit.service.MessageService; +//import com.sprint.mission.discodeit.service.UserService; +// +//import java.io.FileInputStream; +//import java.io.FileOutputStream; +//import java.io.ObjectInputStream; +//import java.io.ObjectOutputStream; +//import java.util.*; +// +//import static com.sprint.mission.discodeit.util.DataInitializer.*; +// +//public class FileMessageService implements MessageService { +// private static final long serialVersionUID = 1L; +// private final String FILE_PATH = MESSAGE_FILE_PATH; +// +// private final Map data = loadData(); +// +// private final UserService userService; +// private final ChannelService channelService; +// +// public FileMessageService(UserService userService, ChannelService channelService) { +// this.userService = userService; +// this.channelService = channelService; +// } +// +// //메시지 생성 +// @Override +// public void create(Message message) { +// data.put(message.getId(), message); +// saveData(); +// } +// +// //메시지 조회 +// @Override +// public Message find(UUID id) { +// Message message = this.data.get(id); +// +// //메시지id 존재하지 않음 +// if (message == null) { +// throw new IllegalArgumentException(" --해당 ID의 메시지를 찾을 수 없습니다."); +// } +// return this.data.get(id); +// } +// +// //메시지 전체조회 +// @Override +// public List findAll() { +// return new ArrayList<>(this.data.values()); +// } +// +// //메시지 수정 +// @Override +// public Message update(UUID id, Message update) { +// Message selected = this.data.get(id); +// selected.update(update); +// return selected; +// } +// +// //메시지 삭제 +// @Override +// public boolean delete(UUID id) { +// return data.remove(id) != null; +// } +// +// private void saveData() { +// try (FileOutputStream fos = new FileOutputStream(FILE_PATH); +// ObjectOutputStream oos = new ObjectOutputStream(fos)) { +// oos.writeObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// // 불러오기 메서드 +// @SuppressWarnings("unchecked") +// private Map loadData() { +// try (FileInputStream fis = new FileInputStream(FILE_PATH); +// ObjectInputStream ois = new ObjectInputStream(fis)) { +// return (Map) ois.readObject(); +// } catch (Exception e) { +// e.printStackTrace(); +// return new HashMap<>(); +// } +// } +//} 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 index 2826b6ab..9fdf9632 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -1,134 +1,134 @@ -package com.sprint.mission.discodeit.service.file; - - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.DataInitializer.*; - -public class FileUserService implements UserService { - private static final long serialVersionUID = 1L; - private final String FILE_PATH = USER_FILE_PATH; - - private Map data = loadData(); - - private final ChannelService channelService; - - public FileUserService(ChannelService channelService) { - this.channelService = channelService; - } - - @Override - public void create(User user) { - for (User existingUser : data.values()) { - if (existingUser.getEmail().equals(user.getEmail())) { - throw new IllegalArgumentException(" --- 이미 등록된 이메일입니다."); - } - } - this.data.put(user.getId(), user); - - saveData(); - } - - //유저 아이디 조회 - @Override - public User read(UUID id) { - return this.data.get(id); - } - - //유저 이름으로 조회 - @Override - public List readByName(String name) { - List result = data.values().stream() - .filter(user -> user.getName().contains(name)) - .collect(Collectors.toList()); - - if (result.isEmpty()) { - throw new IllegalArgumentException("존재하지 않는 유저입니다."); - } - return result; - } - - //유저 전체 조회 - @Override - public List readAll() { - return new ArrayList<>(data.values()); - } - - //유저 수정 - @Override - public User update(UUID id, User update) { - User user = this.data.get(id); - - if (user == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - user.update(update); - return user; - } - - //유저 삭제 - @Override - public boolean delete(UUID id, String password) { - User user = this.data.get(id); - if (!user.getPassword().equals(password)) { - System.out.println("!!유저 탈퇴 실패!! --- 비밀번호 불일치"); - return false; - } - System.out.println("<<유저 [" + user.getName() + "] 탈퇴 성공>>"); - boolean isDeleted = this.data.remove(id) != null; - - if (isDeleted){ - removeUserFromChannels(user); - } - return isDeleted; - } - - //채널 전체에서 해당 유저 삭제 - public void removeUserFromChannels(User user) { - for (Channel channel : channelService.readAll()) { - Set members = new HashSet<>(channel.getMembers()); - if (members.remove(user)) { - Channel updatedChannel = new Channel( - channel.getChannelName(), - channel.getKeyUser(), - channel.getCategory(), - members - ); - channelService.update(channel.getId(), updatedChannel); - } - } - } - - private void saveData() { - try (FileOutputStream fos = new FileOutputStream(FILE_PATH); - ObjectOutputStream oos = new ObjectOutputStream(fos)) { - oos.writeObject(data); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // 불러오기 메서드 - @SuppressWarnings("unchecked") - private Map loadData() { - try (FileInputStream fis = new FileInputStream(FILE_PATH); - ObjectInputStream ois = new ObjectInputStream(fis)) { - return (Map) ois.readObject(); - } catch (Exception e) { - e.printStackTrace(); - return new HashMap<>(); - } - } - -} +//package com.sprint.mission.discodeit.service.file; +// +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.User; +//import com.sprint.mission.discodeit.service.ChannelService; +//import com.sprint.mission.discodeit.service.UserService; +// +//import java.io.FileInputStream; +//import java.io.FileOutputStream; +//import java.io.ObjectInputStream; +//import java.io.ObjectOutputStream; +//import java.util.*; +//import java.util.stream.Collectors; +// +//import static com.sprint.mission.discodeit.util.DataInitializer.*; +// +//public class FileUserService implements UserService { +// private static final long serialVersionUID = 1L; +// private final String FILE_PATH = USER_FILE_PATH; +// +// private Map data = loadData(); +// +// private final ChannelService channelService; +// +// public FileUserService(ChannelService channelService) { +// this.channelService = channelService; +// } +// +// @Override +// public void create(User user) { +// for (User existingUser : data.values()) { +// if (existingUser.getEmail().equals(user.getEmail())) { +// throw new IllegalArgumentException(" --- 이미 등록된 이메일입니다."); +// } +// } +// this.data.put(user.getId(), user); +// +// saveData(); +// } +// +// //유저 아이디 조회 +// @Override +// public User find(UUID id) { +// return this.data.get(id); +// } +// +// //유저 이름으로 조회 +// @Override +// public List findByName(String name) { +// List result = data.values().stream() +// .filter(user -> user.getName().contains(name)) +// .collect(Collectors.toList()); +// +// if (result.isEmpty()) { +// throw new IllegalArgumentException("존재하지 않는 유저입니다."); +// } +// return result; +// } +// +// //유저 전체 조회 +// @Override +// public List findAll() { +// return new ArrayList<>(data.values()); +// } +// +// //유저 수정 +// @Override +// public User update(UUID id, User update) { +// User user = this.data.get(id); +// +// if (user == null) { +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// user.update(update); +// return user; +// } +// +// //유저 삭제 +// @Override +// public boolean delete(UUID id, String password) { +// User user = this.data.get(id); +// if (!user.getPassword().equals(password)) { +// System.out.println("!!유저 탈퇴 실패!! --- 비밀번호 불일치"); +// return false; +// } +// System.out.println("<<유저 [" + user.getName() + "] 탈퇴 성공>>"); +// boolean isDeleted = this.data.remove(id) != null; +// +// if (isDeleted){ +// removeUserFromChannels(user); +// } +// return isDeleted; +// } +// +// //채널 전체에서 해당 유저 삭제 +// public void removeUserFromChannels(User user) { +// for (Channel channel : channelService.findAllByUserId()) { +// Set members = new HashSet<>(channel.getMembers()); +// if (members.remove(user)) { +// Channel updatedChannel = new Channel( +// channel.getChannelName(), +// channel.getKeyUser(), +// channel.getCategory(), +// members +// ); +// channelService.update(channel.getId(), updatedChannel); +// } +// } +// } +// +// private void saveData() { +// try (FileOutputStream fos = new FileOutputStream(FILE_PATH); +// ObjectOutputStream oos = new ObjectOutputStream(fos)) { +// oos.writeObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// // 불러오기 메서드 +// @SuppressWarnings("unchecked") +// private Map loadData() { +// try (FileInputStream fis = new FileInputStream(FILE_PATH); +// ObjectInputStream ois = new ObjectInputStream(fis)) { +// return (Map) ois.readObject(); +// } catch (Exception e) { +// e.printStackTrace(); +// return new HashMap<>(); +// } +// } +// +//} 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 index ea8ce2a3..1cfcc086 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -1,117 +1,116 @@ -package com.sprint.mission.discodeit.service.jcf; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; - - -import java.util.*; -import java.util.stream.Collectors; - -public class JCFChannelService implements ChannelService { - private static JCFChannelService instance; - private final Map data = new HashMap<>(); - - private JCFChannelService() {} - - public static JCFChannelService getInstance() { - if (instance == null) { - instance = new JCFChannelService(); - } - return instance; - } - - //채널 생성 - @Override - public void create(Channel channel) { - - //중복 채널명 검증 - for (Channel existingChannel : data.values()) { - if (existingChannel.getChannelName().equals(channel.getChannelName()) - && existingChannel.getKeyUser().equals(channel.getKeyUser())) { - throw new IllegalArgumentException(" --- "+ channel.getKeyUser().getName()+"님! 이미 등록된 채널입니다."); - } - } - - //중복 카테고리 검증 - Set categorySet = new HashSet<>(channel.getCategory()); - if (channel.getCategory().size() != categorySet.size()) { //list사이즈=2, set사이즈1 -> 중복있다 - throw new IllegalArgumentException(" --- 중복된 카테고리가 포함되어 있습니다."); - } - channel.getMembers().add(channel.getKeyUser()); // 키 유저를 초기 멤버로 추가 - - data.put(channel.getId(), channel); - - } - - //채널 조회 - @Override - public Channel read(UUID id) { - Channel channel = this.data.get(id); - - if (channel == null) { //아무 객체도 가리키지 않음 - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - return channel; - } - - //채널 전체 조회 - @Override - public List readAll() { - List channels = new ArrayList<>(data.values()); - - if (channels.isEmpty()) { //리스트있지만 요소없음 - System.out.println(" --조회 가능한 채널이 없습니다."); - } - - return channels; - } - - //채널 수정 - @Override - public Channel update(UUID id, Channel update) { - Channel channel = this.data.get(id); - - if (channel == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - channel.update(update); - return channel; - } - - //채널 삭제 - @Override - public boolean delete(UUID id, User user, String password) { - Channel channel = this.data.get(id); - if (!user.getPassword().equals(password)) { - System.out.println("!!채널 삭제 실패!! --- 비밀번호 불일치"); - return false; - } - System.out.println("<<채널 [" + channel.getChannelName() + "] 삭제 성공>>"); - return this.data.remove(id) != null; - } - - - //채널 멤버셋 - @Override - public Set members(UUID id) { - Channel channel = data.get(id); - return channel != null ? channel.getMembers() : Set.of(); - } - - //특정 채널 정보 - public List readByName(String channelName) { - List result = data.values().stream() - .filter(channel -> channel.getChannelName().contains(channelName)) - .collect(Collectors.toList()); - - if (result.isEmpty()) { - throw new IllegalArgumentException("존재하지 않는 채널입니다."); - } - return result; - } - - -} +//package com.sprint.mission.discodeit.service.jcf; +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.User; +//import com.sprint.mission.discodeit.service.ChannelService; +// +//import java.util.*; +//import java.util.stream.Collectors; +// +//public class JCFChannelService implements ChannelService { +// private static JCFChannelService instance; +// private final Map data = new HashMap<>(); +// +// private JCFChannelService() {} +// +// public static JCFChannelService getInstance() { +// if (instance == null) { +// instance = new JCFChannelService(); +// } +// return instance; +// } +// +// //채널 생성 +// @Override +// public void create(Channel channel) { +// +// //중복 채널명 검증 +// for (Channel existingChannel : data.values()) { +// if (existingChannel.getChannelName().equals(channel.getChannelName()) +// && existingChannel.getKeyUser().equals(channel.getKeyUser())) { +// throw new IllegalArgumentException(" --- "+ channel.getKeyUser().getName()+"님! 이미 등록된 채널입니다."); +// } +// } +// +// //중복 카테고리 검증 +// Set categorySet = new HashSet<>(channel.getCategory()); +// if (channel.getCategory().size() != categorySet.size()) { //list사이즈=2, set사이즈1 -> 중복있다 +// throw new IllegalArgumentException(" --- 중복된 카테고리가 포함되어 있습니다."); +// } +// channel.getMembers().add(channel.getKeyUser()); // 키 유저를 초기 멤버로 추가 +// +// data.put(channel.getId(), channel); +// +// } +// +// //채널 조회 +// @Override +// public Channel find(UUID id) { +// Channel channel = this.data.get(id); +// +// if (channel == null) { //아무 객체도 가리키지 않음 +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// return channel; +// } +// +// //채널 전체 조회 +// @Override +// public List findAllByUserId() { +// List channels = new ArrayList<>(data.values()); +// +// if (channels.isEmpty()) { //리스트있지만 요소없음 +// System.out.println(" --조회 가능한 채널이 없습니다."); +// } +// +// return channels; +// } +// +// //채널 수정 +// @Override +// public Channel update(UUID id, Channel update) { +// Channel channel = this.data.get(id); +// +// if (channel == null) { +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// channel.update(update); +// return channel; +// } +// +// //채널 삭제 +// @Override +// public boolean delete(UUID id, User user, String password) { +// Channel channel = this.data.get(id); +// if (!user.getPassword().equals(password)) { +// System.out.println("!!채널 삭제 실패!! --- 비밀번호 불일치"); +// return false; +// } +// System.out.println("<<채널 [" + channel.getChannelName() + "] 삭제 성공>>"); +// return this.data.remove(id) != null; +// } +// +// +// //채널 멤버셋 +// @Override +// public Set members(UUID id) { +// Channel channel = data.get(id); +// return channel != null ? channel.getMembers() : Set.of(); +// } +// +// //특정 채널 정보 +// public List findByChannelName(String channelName) { +// List result = data.values().stream() +// .filter(channel -> channel.getChannelName().contains(channelName)) +// .collect(Collectors.toList()); +// +// if (result.isEmpty()) { +// throw new IllegalArgumentException("존재하지 않는 채널입니다."); +// } +// return result; +// } +// +// +//} 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 index 7c284d44..5ef604ed 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -1,74 +1,74 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - - -import java.util.*; - -public class JCFMessageService implements MessageService { - private static JCFMessageService instance; - private final Map data = new LinkedHashMap<>(); - private final UserService userService; - private final ChannelService channelService; - - public JCFMessageService(UserService userService, ChannelService channelService) { - this.userService = userService; - this.channelService = channelService; - } - - public static JCFMessageService getInstance(UserService userService, ChannelService channelService) { - if (instance == null) { - instance = new JCFMessageService(userService, channelService); - } - return instance; - } - - //메시지 생성 - @Override - public void create(Message message) { - Channel channel = message.getChannel(); - channel.validateMembership(message.getSender()); - channel.validateCategory(message.getCategory()); - - message.validateContent(); - data.put(message.getId(), message); - } - - //메시지 조회 - @Override - public Message read(UUID id) { - Message message = this.data.get(id); - - //메시지id 존재하지 않음 - if (message == null) { - throw new IllegalArgumentException(" --해당 ID의 메시지를 찾을 수 없습니다."); - } - return this.data.get(id); - } - - //메시지 전체조회 - @Override - public List readAll() { - return new ArrayList<>(this.data.values()); - } - - //메시지 수정 - @Override - public Message update(UUID id, Message update) { - Message selected = this.data.get(id); - selected.update(update); - return selected; - } - - //메시지 삭제 - @Override - public boolean delete(UUID id) { - return data.remove(id) != null; - } - - -} +//package com.sprint.mission.discodeit.service.jcf; +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.Message; +//import com.sprint.mission.discodeit.service.ChannelService; +//import com.sprint.mission.discodeit.service.MessageService; +//import com.sprint.mission.discodeit.service.UserService; +// +// +//import java.util.*; +// +//public class JCFMessageService implements MessageService { +// private static JCFMessageService instance; +// private final Map data = new LinkedHashMap<>(); +// private final UserService userService; +// private final ChannelService channelService; +// +// public JCFMessageService(UserService userService, ChannelService channelService) { +// this.userService = userService; +// this.channelService = channelService; +// } +// +// public static JCFMessageService getInstance(UserService userService, ChannelService channelService) { +// if (instance == null) { +// instance = new JCFMessageService(userService, channelService); +// } +// return instance; +// } +// +// //메시지 생성 +// @Override +// public void create(Message message) { +// Channel channel = message.getChannel(); +// channel.validateMembership(message.getSender()); +// channel.validateCategory(message.getCategory()); +// +// message.validateContent(); +// data.put(message.getId(), message); +// } +// +// //메시지 조회 +// @Override +// public Message find(UUID id) { +// Message message = this.data.get(id); +// +// //메시지id 존재하지 않음 +// if (message == null) { +// throw new IllegalArgumentException(" --해당 ID의 메시지를 찾을 수 없습니다."); +// } +// return this.data.get(id); +// } +// +// //메시지 전체조회 +// @Override +// public List findAll() { +// return new ArrayList<>(this.data.values()); +// } +// +// //메시지 수정 +// @Override +// public Message update(UUID id, Message update) { +// Message selected = this.data.get(id); +// selected.update(update); +// return selected; +// } +// +// //메시지 삭제 +// @Override +// public boolean delete(UUID id) { +// return data.remove(id) != null; +// } +// +// +//} 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 index dc9d5a89..585c0a14 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -1,110 +1,110 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; -import java.util.stream.Collectors; - -public class JCFUserService implements UserService { - private static JCFUserService instance; - private final Map data = new HashMap<>(); - private final ChannelService channelService; - - public JCFUserService(ChannelService channelService) { - this.channelService = channelService; - } - - public static JCFUserService getInstance(ChannelService channelService) { - if (instance == null) { - instance = new JCFUserService(channelService); - } - return instance; - } - - //유저 생성 - @Override - public void create(User user) { - //이미 등록된 이메일 추가시 - for (User existingUser : data.values()) { - if (existingUser.getEmail().equals(user.getEmail())) { - throw new IllegalArgumentException(" --- 이미 등록된 이메일입니다."); - } - } - this.data.put(user.getId(), user); - } - - //유저 아이디 조회 - @Override - public User read(UUID id) { - return this.data.get(id); - } - - //유저 이름으로 조회 - @Override - public List readByName(String name) { - List result = data.values().stream() - .filter(user -> user.getName().contains(name)) - .collect(Collectors.toList()); - - if (result.isEmpty()) { - throw new IllegalArgumentException("존재하지 않는 유저입니다."); - } - return result; - } - - //유저 전체 조회 - @Override - public List readAll() { - return new ArrayList<>(data.values()); - } - - //유저 수정 - @Override - public User update(UUID id, User update) { - User user = this.data.get(id); - - if (user == null) { - throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); - } - - user.update(update); - return user; - } - - //유저 삭제 - @Override - public boolean delete(UUID id, String password) { - User user = this.data.get(id); - if (!user.getPassword().equals(password)) { - System.out.println("!!유저 탈퇴 실패!! --- 비밀번호 불일치"); - return false; - } - System.out.println("<<유저 [" + user.getName() + "] 탈퇴 성공>>"); - boolean isDeleted = this.data.remove(id) != null; - - if (isDeleted){ - removeUserFromChannels(user); - } - return isDeleted; - } - - //채널 전체에서 해당 유저 삭제 - public void removeUserFromChannels(User user) { - for (Channel channel : channelService.readAll()) { - Set members = new HashSet<>(channel.getMembers()); - if (members.remove(user)) { - Channel updatedChannel = new Channel( - channel.getChannelName(), - channel.getKeyUser(), - channel.getCategory(), - members - ); - channelService.update(channel.getId(), updatedChannel); - } - } - } - -} \ No newline at end of file +//package com.sprint.mission.discodeit.service.jcf; +// +//import com.sprint.mission.discodeit.entity.Channel; +//import com.sprint.mission.discodeit.entity.User; +//import com.sprint.mission.discodeit.service.ChannelService; +//import com.sprint.mission.discodeit.service.UserService; +// +//import java.util.*; +//import java.util.stream.Collectors; +// +//public class JCFUserService implements UserService { +// private static JCFUserService instance; +// private final Map data = new HashMap<>(); +// private final ChannelService channelService; +// +// public JCFUserService(ChannelService channelService) { +// this.channelService = channelService; +// } +// +// public static JCFUserService getInstance(ChannelService channelService) { +// if (instance == null) { +// instance = new JCFUserService(channelService); +// } +// return instance; +// } +// +// //유저 생성 +// @Override +// public void create(User user) { +// //이미 등록된 이메일 추가시 +// for (User existingUser : data.values()) { +// if (existingUser.getEmail().equals(user.getEmail())) { +// throw new IllegalArgumentException(" --- 이미 등록된 이메일입니다."); +// } +// } +// this.data.put(user.getId(), user); +// } +// +// //유저 아이디 조회 +// @Override +// public User find(UUID id) { +// return this.data.get(id); +// } +// +// //유저 이름으로 조회 +// @Override +// public List findByName(String name) { +// List result = data.values().stream() +// .filter(user -> user.getName().contains(name)) +// .collect(Collectors.toList()); +// +// if (result.isEmpty()) { +// throw new IllegalArgumentException("존재하지 않는 유저입니다."); +// } +// return result; +// } +// +// //유저 전체 조회 +// @Override +// public List findAll() { +// return new ArrayList<>(data.values()); +// } +// +// //유저 수정 +// @Override +// public User update(UUID id, User update) { +// User user = this.data.get(id); +// +// if (user == null) { +// throw new IllegalArgumentException(" --해당 ID의 채널을 찾을 수 없습니다."); +// } +// +// user.update(update); +// return user; +// } +// +// //유저 삭제 +// @Override +// public boolean delete(UUID id, String password) { +// User user = this.data.get(id); +// if (!user.getPassword().equals(password)) { +// System.out.println("!!유저 탈퇴 실패!! --- 비밀번호 불일치"); +// return false; +// } +// System.out.println("<<유저 [" + user.getName() + "] 탈퇴 성공>>"); +// boolean isDeleted = this.data.remove(id) != null; +// +// if (isDeleted){ +// removeUserFromChannels(user); +// } +// return isDeleted; +// } +// +// //채널 전체에서 해당 유저 삭제 +// public void removeUserFromChannels(User user) { +// for (Channel channel : channelService.findAllByUserId()) { +// Set members = new HashSet<>(channel.getMembers()); +// if (members.remove(user)) { +// Channel updatedChannel = new Channel( +// channel.getChannelName(), +// channel.getKeyUser(), +// channel.getCategory(), +// members +// ); +// channelService.update(channel.getId(), updatedChannel); +// } +// } +// } +// +//} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/user.ser b/src/main/java/com/sprint/mission/discodeit/user.ser deleted file mode 100644 index ed86f9c8..00000000 Binary files a/src/main/java/com/sprint/mission/discodeit/user.ser and /dev/null differ diff --git a/src/main/java/com/sprint/mission/discodeit/util/DataInitializer.java b/src/main/java/com/sprint/mission/discodeit/util/DataInitializer.java index 13713170..47f35194 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/DataInitializer.java +++ b/src/main/java/com/sprint/mission/discodeit/util/DataInitializer.java @@ -1,35 +1,43 @@ package com.sprint.mission.discodeit.util; +import com.sprint.mission.discodeit.config.DiscodeitProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + import java.io.File; import java.nio.file.Path; import java.util.List; //초기화 +@Component +@RequiredArgsConstructor public class DataInitializer { - public static final String CHANNEL_FILE_PATH = "src/main/java/com/sprint/mission/discodeit/channel.ser"; - public static final String USER_FILE_PATH = "src/main/java/com/sprint/mission/discodeit/user.ser"; - public static final String MESSAGE_FILE_PATH = "src/main/java/com/sprint/mission/discodeit/message.ser"; + private final DiscodeitProperties properties; - private static final List FILE_PATHS = List.of( - CHANNEL_FILE_PATH, - USER_FILE_PATH, - MESSAGE_FILE_PATH - ); + public void clearSerializedData() { + String basePath = properties.getFilePath(); + List fileNames = List.of( + "channel.ser", + "user.ser", + "message.ser", + "binarycontent.ser", + "readstatus.ser", + "userstatus.ser" + ); - public static void clearSerializedData() { - for (String path : FILE_PATHS) { + for (String fileName : fileNames) { try { - File file = Path.of(path).toFile(); + File file = Path.of(basePath, fileName).toFile(); if (file.exists()) { boolean deleted = file.delete(); if (deleted) { - System.out.println("초기화 완료 " + file.getName()); + System.out.println("초기화 완료: " + file.getName()); } else { - System.out.println("초기화 실패 " + file.getName()); + System.out.println("초기화 실패: " + file.getName()); } } else { - System.out.println("초기화할 파일이 존재하지 않음 " + file.getName()); + System.out.println("초기화할 파일 없음: " + file.getName()); } } catch (Exception e) { System.out.println("!예외 발생!"); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 00000000..f000216a --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,8 @@ +spring: + application: + name: discodeit + +discodeit: + repository: + type: file + file-path: src/main/resources/data/ \ No newline at end of file diff --git a/src/main/resources/data/binarycontent.ser b/src/main/resources/data/binarycontent.ser new file mode 100644 index 00000000..c5975123 Binary files /dev/null and b/src/main/resources/data/binarycontent.ser differ diff --git a/src/main/resources/data/channel.ser b/src/main/resources/data/channel.ser new file mode 100644 index 00000000..88c89c5e Binary files /dev/null and b/src/main/resources/data/channel.ser differ diff --git a/src/main/resources/data/message.ser b/src/main/resources/data/message.ser new file mode 100644 index 00000000..f4129a25 Binary files /dev/null and b/src/main/resources/data/message.ser differ diff --git a/src/main/resources/data/readstatus.ser b/src/main/resources/data/readstatus.ser new file mode 100644 index 00000000..0d2f1aaa Binary files /dev/null and b/src/main/resources/data/readstatus.ser differ diff --git a/src/main/resources/data/user.ser b/src/main/resources/data/user.ser new file mode 100644 index 00000000..20b9f289 Binary files /dev/null and b/src/main/resources/data/user.ser differ diff --git a/src/main/resources/data/userstatus.ser b/src/main/resources/data/userstatus.ser new file mode 100644 index 00000000..69c76fd7 Binary files /dev/null and b/src/main/resources/data/userstatus.ser differ diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 00000000..6e6e0fce Binary files /dev/null and b/src/main/resources/icon.png differ 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() { + } + +}