diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..ae33a92e Binary files /dev/null and b/.DS_Store differ diff --git a/3-sprint-mission/HELP.md b/3-sprint-mission/HELP.md new file mode 100644 index 00000000..21c0746f --- /dev/null +++ b/3-sprint-mission/HELP.md @@ -0,0 +1,22 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Gradle documentation](https://docs.gradle.org) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.4/gradle-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.4/gradle-plugin/packaging-oci-image.html) +* [Spring Web](https://docs.spring.io/spring-boot/3.4.4/reference/web/servlet.html) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) + +### Additional Links +These additional references should also help you: + +* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle) + diff --git a/3-sprint-mission/build.gradle b/3-sprint-mission/build.gradle index 64b612e0..1c8b5c58 100644 --- a/3-sprint-mission/build.gradle +++ b/3-sprint-mission/build.gradle @@ -1,19 +1,36 @@ plugins { - id 'java' + id 'java' + id 'org.springframework.boot' version '3.4.4' + id 'io.spring.dependency-management' version '1.1.7' } -group = 'org.example' -version = '1.0-SNAPSHOT' +group = 'com.sprint.mission' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} repositories { - mavenCentral() + mavenCentral() } dependencies { - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } -test { - useJUnitPlatform() -} \ No newline at end of file +tasks.named('test') { + useJUnitPlatform() +} diff --git a/3-sprint-mission/data/users.ser b/3-sprint-mission/data/users.ser deleted file mode 100644 index 59ebabc2..00000000 Binary files a/3-sprint-mission/data/users.ser and /dev/null differ diff --git a/3-sprint-mission/gradle/wrapper/gradle-wrapper.jar b/3-sprint-mission/gradle/wrapper/gradle-wrapper.jar index 249e5832..9bbc975c 100644 Binary files a/3-sprint-mission/gradle/wrapper/gradle-wrapper.jar and b/3-sprint-mission/gradle/wrapper/gradle-wrapper.jar differ diff --git a/3-sprint-mission/gradle/wrapper/gradle-wrapper.properties b/3-sprint-mission/gradle/wrapper/gradle-wrapper.properties index 2b2351a9..37f853b1 100644 --- a/3-sprint-mission/gradle/wrapper/gradle-wrapper.properties +++ b/3-sprint-mission/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Tue Apr 08 16:16:18 KST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/3-sprint-mission/gradlew b/3-sprint-mission/gradlew index 1b6c7873..faf93008 100755 --- a/3-sprint-mission/gradlew +++ b/3-sprint-mission/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/3-sprint-mission/gradlew.bat b/3-sprint-mission/gradlew.bat index ac1b06f9..9b42019c 100644 --- a/3-sprint-mission/gradlew.bat +++ b/3-sprint-mission/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/3-sprint-mission/settings.gradle b/3-sprint-mission/settings.gradle index 79373e36..2437dfb2 100644 --- a/3-sprint-mission/settings.gradle +++ b/3-sprint-mission/settings.gradle @@ -1,2 +1 @@ -rootProject.name = '3-sprint-mission' - +rootProject.name = 'discodeit' diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java new file mode 100644 index 00000000..846ebc7b --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -0,0 +1,167 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.dto.PrivateChannelCreateDTO; +import com.sprint.mission.discodeit.dto.PublicChannelCreateDTO; +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.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.AuthService; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +import java.io.IOException; +import java.util.ArrayList; + +@SpringBootApplication +public class DiscodeitApplication { + public static void main(String[] args) throws IOException, IllegalAccessException { + ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); + + UserService userService = context.getBean(UserService.class); + ChannelService channelService = context.getBean(ChannelService.class); + MessageService messageService = context.getBean(MessageService.class); + AuthService authService = context.getBean(AuthService.class); + + //// 1) User 도메인 + // Create users (등록) + System.out.println("사용자 등록"); + User user1 = userService.create("jspark", "jinsol8k@gmail.com","1234", "박진솔"); + User user2 = userService.create("killdong", "hongkd@gmail.com","1234", "홍길동"); + +// User user1 = userService.findByUsername("jspark"); + + // 다건 조회 + userService.findAll().forEach(System.out::println); + + // 단건 조회 + System.out.println("사용자 ID로 검색"); + System.out.println(userService.findByUsername("killdong").toString()); + System.out.println("-----------------------"); + + // 단건 조회 + System.out.println("사용자 Email로 검색"); + System.out.println(userService.findByEmail("jinsol8k@gmail.com").toString()); + System.out.println("-----------------------"); + + // 단건 조회 + System.out.println("사용자 이름으로 검색"); + userService.findByName("박진솔").forEach(System.out::println); + System.out.println("-----------------------"); + + // 로그인 서비스 + System.out.println("로그인 하십시오."); + User currentUser = authService.login("jspark", "123456"); + System.out.println("-----------------------"); + System.out.println("현재 사용자: "); + System.out.println(userService.find(currentUser.getId()).toString()); + System.out.println("-----------------------"); + + // 사용자 정보 수정 + System.out.println("비밀번호 변경"); + userService.updatePassword(user1.getId(), "1234!@#$"); + System.out.println("-----------------------"); + +// System.out.println("이전 비밀번호로 로그인 시도"); +// currentUser = authService.login("jspark", "1234"); +// System.out.println("-----------------------"); + + System.out.println("변경 후 비밀번호로 로그인 시도"); + currentUser = authService.login("jspark", "1234!@#$"); + System.out.println("-----------------------"); + + // Delete user (삭제) + System.out.println("삭제할 사용자를 입력해주십시오."); + userService.delete(userService.findByUsername("killdong").getId()); + System.out.println("-----------------------"); + + // 삭제 후 유저 목록 확인 + userService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); + + System.out.println("======================="); + + //// 2. Channel 도메인 + // Create channels (등록) + PublicChannelCreateDTO publicChannelCreateDTO = new PublicChannelCreateDTO(user1.getId(), "첫번째 채팅방", false); + PrivateChannelCreateDTO privateChannelCreateDTO = new PrivateChannelCreateDTO(user1.getId(), "두번째 채팅방", null, true); + + channelService.create(publicChannelCreateDTO); + channelService.create(privateChannelCreateDTO); + + // Show all channels (다건 조회) + channelService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); + + // Search channel by channel name (단건 조회) + System.out.println("채팅방 이름으로 검색"); + channelService.findByName("첫번째").forEach(System.out::println); + System.out.println("-----------------------"); + + Channel currentChannel = channelService.findByName("두번째").get(0); + + // Update channel information (수정) + System.out.println("변경할 채팅방 선택"); + channelService.updateName(currentChannel.getId(), "두번째 채팅방 -> 비밀방으로 변경함"); + System.out.println("-----------------------"); + + // Check updated channel information (수정된 데이터 조회) + channelService.findAll().forEach(System.out::println); + + // Remove channel (채팅방 삭제) + System.out.println("삭제할 채팅방 선택"); + System.out.println("첫번째 채팅방 삭제"); + channelService.delete(channelService.findAll().get(0).getId()); + System.out.println("-----------------------"); + + System.out.println("삭제 후 채팅방 목록 확인"); + channelService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); + + System.out.println("======================="); + + //// 3) Message 도메인 + // Create messages (등록) + System.out.println("(메시지 등록 종료: X)"); + System.out.println("-----------------------"); + messageService.create(user1.getId(), currentChannel.getId(), "하이요!"); + messageService.create(user1.getId(), currentChannel.getId(), "^^"); + messageService.create(user1.getId(), currentChannel.getId(), "반가워요~~~~~"); + messageService.create(user1.getId(), currentChannel.getId(), "좋은하루되세여!!!"); + messageService.create(user1.getId(), currentChannel.getId(), "ㅎㄱ ㄷㄱㄷㄱ"); + + // Show all messages (다건 조회) + System.out.println("메시지 전체 조회"); + messageService.findAllByChannelId(currentChannel.getId()).forEach(System.out::println); + System.out.println("-----------------------"); + + // Search message by text (단건 조회) + System.out.println("메시지 검색"); + messageService.findByText("ㄷㄱㄷㄱ").forEach(System.out::println); + System.out.println("-----------------------"); + + // Update message (수정) + System.out.println("다섯번째 메시지 변경"); + messageService.update(messageService.findAllByChannelId(currentChannel.getId()).get(4).getId(), "듀근듀근!!"); + + // 변경된 메시지 확인 + System.out.println(messageService.find(messageService.findAllByChannelId(currentChannel.getId()).get(4).getId()).toString()); + System.out.println("-----------------------"); + + // Remove message (메시지 삭제) + System.out.println("두번째 메시지 삭제"); + messageService.delete(messageService.findAllByChannelId(currentChannel.getId()).get(1).getId()); + + // 메시지 삭제 확인 + messageService.findAllByChannelId(currentChannel.getId()).forEach(System.out::println); + System.out.println("-----------------------"); + + + } + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ChannelUserDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ChannelUserDTO.java new file mode 100644 index 00000000..fe5a9e18 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ChannelUserDTO.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto; + +import java.time.Instant; +import java.util.UUID; + +public record ChannelUserDTO( + UUID userId, + UUID channelId +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/LoginDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/LoginDTO.java new file mode 100644 index 00000000..ef474bc5 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/LoginDTO.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto; + +public record LoginDTO( + String username, + String password +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateDTO.java new file mode 100644 index 00000000..4084d481 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateDTO.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto; + +import java.util.List; +import java.util.UUID; + +public record PrivateChannelCreateDTO( + UUID userId, + String channalName, + List entry, + boolean isPriavate +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateDTO.java new file mode 100644 index 00000000..7767582c --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateDTO.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto; + +import java.util.UUID; + +public record PublicChannelCreateDTO( + UUID userId, + String channalName, + boolean isPriavate +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDTO.java new file mode 100644 index 00000000..0f8771dc --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDTO.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusCreateDTO( + UUID userId, + UUID channelId, + Instant lastReadAt +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDTO.java new file mode 100644 index 00000000..4a1dec70 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDTO.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto; + +import java.time.Instant; + +public record ReadStatusUpdateDTO( + Instant lastReadAt +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserCreateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserCreateDTO.java new file mode 100644 index 00000000..222225ff --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserCreateDTO.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto; + +public record UserCreateDTO( + String username, + String email, + String password, + String name +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserDTO.java new file mode 100644 index 00000000..3058dba6 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserDTO.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.dto; + +import java.time.Instant; +import java.util.UUID; + +public record UserDTO( + UUID id, + String username, + String email, + String name, + UUID profileId, + boolean isLogin, + Instant createdAt, + Instant updatedAt, + Instant loginTime + +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDTO.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDTO.java new file mode 100644 index 00000000..0946176e --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDTO.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto; + +import java.util.UUID; + +public record UserUpdateDTO( + UUID id, + String newName, + String newEmail, + String newPassword, + UUID profileId +) { +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java new file mode 100644 index 00000000..caaff0d3 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,32 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Data; +import lombok.Getter; +import lombok.ToString; + +import java.time.Instant; +import java.util.UUID; + +@Data +@Getter +@ToString +public class BinaryContent { + private final UUID id; + private final UUID userId; + private String fileName; + private byte[] content; + private String contentType; + private final Instant createdAt; + + public BinaryContent(UUID userId, String fileName, byte[] content, String contentType) { + this.id = UUID.randomUUID(); + this.userId = userId; + this.fileName = fileName; + this.content = content; + this.contentType = contentType; + this.createdAt = Instant.now(); + } + + + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 939d7451..81b5ff5d 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,48 +1,39 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; -import com.sprint.mission.discodeit.service.UserService; +import lombok.Data; +import lombok.Getter; import java.io.Serializable; -import java.sql.Array; import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.UUID; +@Data +@Getter public class Channel implements Serializable { - private static final long serialVersionUID = 1L; private final UUID id; private String name; private final UUID maker; + private final boolean isPrivate; private List entry; - private final Long createdAt; - private Long updatedAt; +// ㄴ DB로 이관하는 경우, 필드값에 List가 들어가는 건 적절치 않음. +// 차라리 table을 따로 만들어서 관리하는 게 나음. + private final Instant createdAt; + private Instant updatedAt; + private Instant enteredAt; - public Channel(UUID currentUser, String name) { + public Channel(UUID userId, String name, boolean isPrivate) { this.id = UUID.randomUUID(); this.name = name; - this.maker = currentUser; + this.maker = userId; + this.isPrivate = false; this.entry = new ArrayList<>(); - this.entry.add(currentUser); - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); - } - - public UUID getId() { - return id; - } - - public String getName() { - return name; - } - - public UUID getMaker() { - return maker; - } - - public List getEntry() { - return entry; + this.entry.add(userId); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + this.enteredAt = Instant.now(); } // Date 타입 포매팅 @@ -69,19 +60,23 @@ public String toString() { } public void addEntry(UUID userId) { - if (entry == null) { - this.entry.add(maker); - } else { - this.entry.add(userId); - } + this.entry.add(userId); + } + + public void addEntry(List userIds) { + this.entry.addAll(userIds); } - public void updateById(UUID id, String name) { + public void updateName(String name) { this.name = name; updateDateTime(); } public void updateDateTime() { - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); + } + + public void updateEnteredAt() { + this.enteredAt = Instant.now(); } } diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java index c5605d43..911e6ca3 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,53 +1,35 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; +import lombok.Data; +import lombok.Getter; import java.io.Serializable; import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.UUID; +@Data +@Getter public class Message implements Serializable { - private static final long serialVersionUID = 1L; private String text; private final UUID id; - private final UUID sender; - private final UUID channel; - private final Long createdAt; - private Long updatedAt; + private final UUID authorId; + private final UUID channelId; + private final Instant createdAt; + private Instant updatedAt; private boolean updated; public Message(UUID currentUserId, UUID currentChannelId, String text) { this.id = UUID.randomUUID(); - this.sender = currentUserId; - this.channel = currentChannelId; + this.authorId = currentUserId; + this.channelId = currentChannelId; this.text = text; - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); this.updated = false; } - public UUID getId() { - return id; - } - - public String getText() { - return text; - } - - // Sender 이름 반환 - public UUID getSender() { - return sender; - } - - // CHannel 이름 반환 - public UUID getChannel() { - return channel; - } - // Date 타입 포매팅 public String getCreatedAt() { String formattedCreatedTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createdAt); @@ -65,7 +47,7 @@ public String toString() { if (!this.updated) { return //"[channel=" + getChannel() + "] " + - "sender=" + getSender() + " : " + + "sender=" + getAuthorId() + " : " + "Message=" + text + " " + // 포매팅된 date 사용 "[createdAt=" + getCreatedAt() + "]" @@ -73,7 +55,7 @@ public String toString() { } else { return //"[channel=" + getChannel() + "] " + - "sender=" + getSender() + " : " + + "sender=" + getAuthorId() + " : " + "Message=" + text + " " + // 포매팅된 date 사용 "[createdAt=" + getCreatedAt() + "]" + @@ -83,14 +65,14 @@ public String toString() { } - public void updateText(UUID id, String text) { + public void updateText(String text) { this.text = text; updateDateTime(); updated(); } public void updateDateTime() { - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } public void updated() { diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java new file mode 100644 index 00000000..06b97ce3 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,37 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.time.Instant; +import java.util.UUID; + +@Data +@Getter +@Setter +@ToString +public class ReadStatus { + private final UUID id; + private final UUID userId; + private final UUID channelId; + private final Instant createdAt; + private Instant updatedAt; + private Instant lastReadAt; + + public ReadStatus(UUID userId, UUID channelId) { + this.id = UUID.randomUUID(); + this.userId = userId; + this.channelId = channelId; + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + this.lastReadAt = null; + + } + + public void update(Instant lastReadAt) { + this.lastReadAt = lastReadAt; + } + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java index 07706e39..7ea36348 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,54 +1,37 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; - import java.io.Serializable; import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.UUID; +import lombok.Data; +import lombok.Getter; +@Data +@Getter public class User implements Serializable { - private static final long serialVersionUID = 1L; private final UUID id; - private final String userid; + private final String username; + private String email; private String password; private String name; - private final Long createdAt; - private Long updatedAt; + private UUID profileId; private boolean isLogin; + private final Instant createdAt; + private Instant updatedAt; + private Instant loginTime; - public User(String userid, String password, String name) { + public User(String username, String email, String password, String name) { this.id = UUID.randomUUID(); - this.userid = userid; + this.username = username; + this.email = email; this.password = password; this.name = name; - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); + this.profileId = null; this.isLogin = false; - } - - public UUID getId() { - - return id; - } - - public String getUserId() { - - return userid; - } - - public String getPassword() { - - return password; - } - - public String getName() { - - return name; - } - - public boolean getIsLogin() { - - return isLogin; + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + this.loginTime = Instant.now(); } // Date 타입 포매팅 @@ -62,36 +45,48 @@ public String getUpdatedAt() { return formattedUpdatedTime; } + public String getLoginTime() { + String formattedLoginTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(loginTime); + return formattedLoginTime; + } + @Override public String toString() { return "User{" + // "id=" + id + - "userid='" + userid + '\'' + + "username='" + username + '\'' + + ", email='" + email + '\'' + ", name='" + name + '\'' + ", createdAt=" + getCreatedAt() + ", updatedAt=" + getUpdatedAt() + - ", isLogin=" + isLogin + + ", loginTime=" + getLoginTime() + + ", isLogin=" + isLogin() + '}'; } - public void setLogin() { - this.isLogin = true; - } - - public void setLogout() { - this.isLogin = false; - } - public void updateName(String name) { this.name = name; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); + } + + public void updateEmail(String email) { + this.email = email; + this.updatedAt = Instant.now(); } public void updatePassword(String password) { this.password = password; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } + public void updateProfile(UUID newProfileId) { + this.profileId = newProfileId; + this.updatedAt = Instant.now(); + } + + public void updateLoginTime() { + this.loginTime = Instant.now(); + } } diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java new file mode 100644 index 00000000..ab5935f8 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,44 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.UUID; + +@Data +@Getter +@ToString +public class UserStatus { + private final UUID id; + private final UUID userId; + private boolean isLogin; + private Instant lastLoginTime; + private final Instant createdAt; + private Instant updatedAt; + + public UserStatus(UUID userId) { + this.id = UUID.randomUUID(); + this.userId = userId; + this.isLogin = true; + this.lastLoginTime = null; + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + } + + public void update(Instant lastLoginTime) { + this.lastLoginTime = lastLoginTime; + } + + public boolean isLogin() { + boolean isLogin = + this.lastLoginTime.isAfter(Instant.now().minus(5, ChronoUnit.MINUTES)); + this.updatedAt = Instant.now(); + return isLogin; + + } + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java new file mode 100644 index 00000000..6c54be41 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.ReadStatus; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +public interface BinaryContentRepository { + + BinaryContent save(BinaryContent binaryContent); + List findAll(); + BinaryContent find(UUID id); + void delete(UUID id) throws IOException; + void deleteByUserId(UUID userId) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java new file mode 100644 index 00000000..cf028875 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.UUID; + +public interface ChannelRepository { + + Channel save(Channel channel); + List findAll(); + Channel find(UUID id); + List findByName(String name); + void addEntry(UUID id, UUID userId); + void delete(UUID id) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java new file mode 100644 index 00000000..0a80ec34 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -0,0 +1,20 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.UUID; + +public interface MessageRepository { + + Message save(Message message); + List findAll(); + List findAllFromChannel(UUID channel); + Message find(UUID id); + List findByText(String text); + void delete(UUID id) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java new file mode 100644 index 00000000..ce42755c --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.ReadStatus; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +public interface ReadStatusRepository { + + ReadStatus save(ReadStatus readStatus); + List findAll(); + ReadStatus find(UUID id); + void delete(UUID id) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java new file mode 100644 index 00000000..bec0c746 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -0,0 +1,23 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.User; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.UUID; + +public interface UserRepository { + + User save(User user) throws IOException; + List findAll(); + User find(UUID id); + User findByUsername(String username); + List findByName(String name); + User findByEmail(String email); + boolean existsId(UUID id); + boolean existsUsername(String username); + boolean existsEmail(String email); + boolean existsName(String name); + void delete(UUID id) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java new file mode 100644 index 00000000..2471cba3 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.UserStatus; + +import java.io.IOException; +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public interface UserStatusRepository { + + UserStatus save(UserStatus userStatus); + List findAll(); + UserStatus find(UUID id); + void delete(UUID id) throws IOException; + void deleteByUserId(UUID userId) throws IOException; +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java new file mode 100644 index 00000000..0ac4c2e7 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -0,0 +1,102 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@Repository +public class FileBinaryContentRepository implements BinaryContentRepository { + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "binaryContent"); + + public FileBinaryContentRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static BinaryContent load(Path filePath) { + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (BinaryContent) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), binaryContent.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(binaryContent); + } catch (IOException e) { + throw new RuntimeException(e); + } + return binaryContent; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public BinaryContent find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public void deleteByUserId(UUID userId) throws IOException { + BinaryContent binaryContent = findAll().stream() + .filter(bc -> bc.getUserId().equals(userId)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + + Files.delete(Paths.get(String.valueOf(DIRECTORY), binaryContent.getId()+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java new file mode 100644 index 00000000..39f99a05 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -0,0 +1,108 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +@Repository +public class FileChannelRepository implements ChannelRepository { + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "channel"); + + public FileChannelRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static Channel load(Path filePath){ + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (Channel) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public Channel save(Channel channel) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), channel.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(channel); + } catch (IOException e) { + throw new RuntimeException(e); + } + return channel; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public Channel find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public List findByName(String name) { + + return findAll().stream() + .filter(c -> c.getName().contains(name)) + .collect(Collectors.toList()); + } + + @Override + public void addEntry(UUID id, UUID userId) { + find(id).addEntry(userId); + save(find(id)); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java new file mode 100644 index 00000000..bc7b103a --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -0,0 +1,110 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +@Repository +public class FileMessageRepository implements MessageRepository { + + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "message"); + + public FileMessageRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static Message load(Path filePath){ + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (Message) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public Message save(Message message) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), message.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(message); + } catch (IOException e) { + throw new RuntimeException(e); + } + return message; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public Message find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public List findAllFromChannel(UUID currentChannel) { + + return findAll().stream() + .filter(m -> m.getChannelId().equals(currentChannel)) + .collect(Collectors.toList()); + } + + @Override + public List findByText(String text) { + + return findAll().stream() + .filter(m -> m.getText().contains(text)) + .collect(Collectors.toList()); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java new file mode 100644 index 00000000..9fc19034 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -0,0 +1,91 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Repository +public class FileReadStatusRepository implements ReadStatusRepository { + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "readStatus"); + + public FileReadStatusRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static ReadStatus load(Path filePath) { + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (ReadStatus) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), readStatus.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(readStatus); + } catch (IOException e) { + throw new RuntimeException(e); + } + return readStatus; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public ReadStatus find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java new file mode 100644 index 00000000..cc77dbc8 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -0,0 +1,134 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +@Repository +public class FileUserRepository implements UserRepository { + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "user"); + + public FileUserRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static User load(Path filePath) { + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (User) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public User save(User user) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), user.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(user); + } catch (IOException e) { + throw new RuntimeException(e); + } + return user; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public User find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public User findByUsername(String username) { + return findAll().stream() + .filter(u -> u.getUsername().equals(username)) + .findFirst().orElseThrow(NoSuchElementException::new); + } + + @Override + public List findByName(String name) { + return findAll().stream() + .filter(u -> u.getName().contains(name)) + .collect(Collectors.toList()); + } + + @Override + public User findByEmail(String email) { + return findAll().stream() + .filter(u -> u.getEmail().equals(email)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public boolean existsId(UUID id) { + return Files.exists(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public boolean existsUsername(String username) { + return findAll().stream().anyMatch(u -> u.getUsername().equals(username)); + } + + @Override + public boolean existsEmail(String email) { + return findAll().stream().anyMatch(u -> u.getEmail().equals(email)); + } + + @Override + public boolean existsName(String name) { + return findAll().stream().anyMatch(u -> u.getName().equals(name)); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java new file mode 100644 index 00000000..7fc2ffe0 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -0,0 +1,102 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import org.springframework.stereotype.Repository; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@Repository +public class FileUserStatusRepository implements UserStatusRepository { + private static final Path DIRECTORY = Paths.get(System.getProperty("user.dir"), "data", "userStatus"); + + public FileUserStatusRepository() { + init(); + } + + // 저장할 경로의 파일 초기화 + public static Path init() { + if (!Files.exists(DIRECTORY)) { + try { + Files.createDirectories(DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return DIRECTORY; + } + + public static UserStatus load(Path filePath) { + if (!Files.exists(filePath)) { + return null; + } + try ( + FileInputStream fis = new FileInputStream(filePath.toFile()); + ObjectInputStream ois = new ObjectInputStream(fis) + ) { + Object data = ois.readObject(); + return (UserStatus) data; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일 로딩 실패", e); + } + } + + @Override + public UserStatus save(UserStatus userStatus) { + Path filePath = Paths.get(String.valueOf(DIRECTORY), userStatus.getId()+".ser"); + try( + FileOutputStream fos = new FileOutputStream(filePath.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + ) { + oos.writeObject(userStatus); + } catch (IOException e) { + throw new RuntimeException(e); + } + return userStatus; + } + + @Override + public List findAll() { + if (!Files.exists(DIRECTORY)) { + return new ArrayList<>(); + } else { + List data = new ArrayList<>(); + File[] files = DIRECTORY.toFile().listFiles(); + if (files != null) { + for (File file : files) { + data.add(load(file.toPath())); + } + } + return data; + } + } + + @Override + public UserStatus find(UUID id) { + return load(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public void delete(UUID id) throws IOException { + Files.delete(Paths.get(String.valueOf(DIRECTORY), id+".ser")); + } + + @Override + public void deleteByUserId(UUID userId) throws IOException { + UserStatus userStatus = findAll().stream() + .filter(us -> us.getUserId().equals(userId)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + + Files.delete(Paths.get(String.valueOf(DIRECTORY), userStatus.getId()+".ser")); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java new file mode 100644 index 00000000..22717577 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +public class JCFChannelRepository implements ChannelRepository { + + private final static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + private final List data; + + public JCFChannelRepository(){ + this.data = new ArrayList<>(); + } + + @Override + public Channel save(Channel channel) { + this.data.add(channel); + return channel; + } + + @Override + public Channel find(UUID id) { + + return findAll().stream() + .filter(c -> c.getId().equals(id)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public List findAll() { + + return this.data; + } + + public List findByName(String name) { + + return findAll().stream() + .filter(c -> c.getName().contains(name)) + .collect(Collectors.toList()); + } + + @Override + public void delete(UUID id) { + this.data.removeIf(c -> c.getId().equals(id)); + } + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java new file mode 100644 index 00000000..0b8f90f5 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -0,0 +1,63 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +public class JCFMessageRepository implements MessageRepository { + private final static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + private final List data; + + public JCFMessageRepository(){ + data = new ArrayList<>(); + } + + @Override + public Message save(Message message) { + this.data.add(message); + return message; + } + + @Override + public List findAll() { + return this.data; + } + + @Override + public List findAllFromChannel(UUID currentChannel) { + + return findAll().stream() + .filter(m -> m.getChannel().equals(currentChannel)) + .collect(Collectors.toList()); + } + + @Override + public Message find(UUID id) { + + return findAll().stream() + .filter(m -> m.getId().equals(id)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public List findByText(String text) { + + return findAll().stream() + .filter(m -> m.getText().contains(text)) + .collect(Collectors.toList()); + } + + @Override + public void delete(UUID id) { + this.data.removeIf(m -> m.getId().equals(id)); + + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java new file mode 100644 index 00000000..0bb8f1e7 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -0,0 +1,83 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; +import java.util.stream.Collectors; + +public class JCFUserRepository implements UserRepository { + private final List data; + + public JCFUserRepository() { + this.data = new ArrayList<>(); + } + + @Override + public User save(User user){ + this.data.add(user); + return user; + } + + @Override + public List findAll() { + return this.data; + } + + @Override + public User find(UUID id) { + return this.data.stream() + .filter(u -> u.getId().equals(id)) + .findFirst().orElseThrow(NoSuchElementException::new); + } + + @Override + public User findByUsername(String username) { + return this.data.stream() + .filter(u -> u.getUsername().equals(username)) + .findFirst().orElseThrow(NoSuchElementException::new); + } + + @Override + public List findByName(String name) { + return this.data.stream() + .filter(u -> u.getName().contains(name)) + .collect(Collectors.toList()); + } + + @Override + public User findByEmail(String email) { + return this.data.stream() + .filter(u -> u.getEmail().equals(email)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public boolean existsId(UUID id) { + return this.data.stream().anyMatch(u -> u.getId().equals(id)); + } + + @Override + public boolean existsUsername(String username) { + return this.data.stream().anyMatch(u -> u.getUsername().equals(username)); + } + + @Override + public boolean existsEmail(String email) { + return this.data.stream().anyMatch(u -> u.getEmail().equals(email)); + } + + @Override + public boolean existsName(String name) { + return this.data.stream().anyMatch(u -> u.getName().equals(name)); + } + + @Override + public void delete(UUID id) { + this.data.removeIf(u -> u.getId().equals(id)); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/run/JavaApplication.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/run/JavaApplication.java index 926ab89a..1713ca71 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/run/JavaApplication.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/run/JavaApplication.java @@ -5,223 +5,161 @@ import java.io.InputStreamReader; import java.util.*; -import com.sprint.mission.discodeit.service.*; -import com.sprint.mission.discodeit.service.jcf.*; -import com.sprint.mission.discodeit.service.file.*; -import com.sprint.mission.discodeit.entity.User; 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.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +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.*; +import com.sprint.mission.discodeit.service.basic.BasicChannelService; +import com.sprint.mission.discodeit.service.basic.BasicMessageService; +import com.sprint.mission.discodeit.service.basic.BasicUserService; +import com.sprint.mission.discodeit.service.AuthService; public class JavaApplication { - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, IllegalAccessException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); -// UserService userService = new JCFUserService(); -// ChannelService channelService = new JCFChannelService(); -// MessageService messageService = new JCFMessageService(); - UserService userService = new FileUserService(); - ChannelService channelService = new FileChannelService(); - MessageService messageService = new FileMessageService(); - //// 1) User 도메인 - // Create users (등록) - System.out.println("사용자 등록"); - userService.create(); + UserRepository userRepository = new FileUserRepository(); + ChannelRepository channelRepository = new FileChannelRepository(); + MessageRepository messageRepository = new FileMessageRepository(); - userService.findAll().forEach(System.out::println); + UserService userService = new BasicUserService(userRepository); + ChannelService channelService = new BasicChannelService(channelRepository); + MessageService messageService = new BasicMessageService(messageRepository); - System.out.println("사용자 등록"); - userService.create(); + AuthService authService = new AuthService(userRepository); - userService.findAll().forEach(System.out::println); + //// 1) User 도메인 + // Create users (등록) System.out.println("사용자 등록"); - userService.create(); +// User user1 = userService.create("jspark", "jinsol8k@gmail.com","1234", "박진솔"); +// User user2 = userService.create("killdong", "hongkd@gmail.com","1234", "홍길동"); + // 다건 조회 userService.findAll().forEach(System.out::println); - // Show first user (단건 조회) + // 단건 조회 System.out.println("사용자 ID로 검색"); - System.out.println("사용자 ID: "); - String searchid = reader.readLine(); - try { - System.out.println(userService.findByUserId(searchid).toString()); - } catch (NoSuchElementException e) { - System.out.println("해당 사용자가 없습니다."); - } - System.out.println("======================="); + System.out.println(userService.findByUsername("killdong").toString()); + System.out.println("-----------------------"); - // Search user by username (단건 조회) - System.out.println("사용자 이름으로 검색"); - System.out.println("사용자 이름: "); - String searchname = reader.readLine(); - userService.findByName(searchname).forEach(System.out::println); - System.out.println("======================="); + // 단건 조회 + System.out.println("사용자 Email로 검색"); + System.out.println(userService.findByEmail("jinsol8k@gmail.com").toString()); + System.out.println("-----------------------"); - // Show all users (다건 조회) - System.out.println("전체 조회"); - userService.findAll().forEach(System.out::println);; - System.out.println("======================="); + // 단건 조회 + System.out.println("사용자 이름으로 검색"); + userService.findByName("박진솔").forEach(System.out::println); + System.out.println("-----------------------"); - // update는 로그인 후 사용 가능 System.out.println("로그인 하십시오."); - User currentuser = userService.login(); - System.out.println("현재 사용자: " + currentuser.getUserId() + "(로그인상태: " + currentuser.getIsLogin() + ")"); + User currentUser = authService.login("jspark", "123456"); + System.out.println("-----------------------"); + System.out.println("현재 사용자: "); + System.out.println(userService.find(currentUser.getId()).toString()); + System.out.println("-----------------------"); + + // 사용자 정보 수정 + System.out.println("비밀번호 변경"); + userService.updatePassword(currentUser.getId(), "123456@"); + System.out.println("-----------------------"); - // Update user information (수정) - userService.update(currentuser.getId()); - System.out.println("변경사항 확인"); - System.out.println(userService.find(currentuser.getId()).toString()); +// System.out.println("이전 비밀번호로 로그인 시도"); +// currentUser = authService.login("jspark", "1234"); +// System.out.println("-----------------------"); + + System.out.println("변경 후 비밀번호로 로그인 시도"); + currentUser = authService.login("jspark", "123456@"); + System.out.println("-----------------------"); // Delete user (삭제) System.out.println("삭제할 사용자를 입력해주십시오."); - System.out.println("삭제할 ID: "); - try { - userService.delete(userService.findByUserId(reader.readLine()).getId()); - } catch (NoSuchElementException e) { - System.out.println("존재하지 않는 사용자입니다."); - } - userService.findAll().forEach(System.out::println); - System.out.println("======================="); + userService.delete(userService.findByUsername("killdong").getId()); + System.out.println("-----------------------"); - // 로그아웃 - System.out.println("로그아웃합니다."); - try { - userService.logout(currentuser); - } catch (NoSuchElementException e) { - System.out.println("존재하지 않는 사용자입니다."); - } + // 삭제 후 유저 목록 확인 + userService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); - // 로그인 - currentuser = userService.login(); - System.out.println("현재 사용자: " + currentuser.getUserId() + "(로그인상태: " + currentuser.getIsLogin() + ")"); + System.out.println("======================="); //// 2. Channel 도메인 // Create channels (등록) - channelService.create(currentuser); - channelService.findAll(currentuser).forEach(System.out::println); + channelService.create(currentUser.getId(),"첫번째 채팅방"); + channelService.create(currentUser.getId(),"두번째 채팅방"); - channelService.create(currentuser); - channelService.findAll(currentuser).forEach(System.out::println); - - channelService.create(currentuser); // Show all channels (다건 조회) - channelService.findAll(currentuser).forEach(System.out::println); - System.out.println("======================="); - - // Show first channel (단건 조회) - System.out.println("첫번째 채팅방 조회"); - System.out.println(channelService.find(currentuser, channelService.findAll(currentuser).get(0).getId()).toString()); - System.out.println("======================="); + channelService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); // Search channel by channel name (단건 조회) System.out.println("채팅방 이름으로 검색"); - try { - channelService.findByName(currentuser, reader.readLine()).forEach(System.out::println); - } catch (NoSuchElementException e) { - System.out.println("해당 채팅방이 존재하지 않습니다."); - } - System.out.println("======================="); + channelService.findByName("첫번째").forEach(System.out::println); + System.out.println("-----------------------"); + + Channel currentChannel = channelService.findByName("두번째").get(0); // Update channel information (수정) System.out.println("변경할 채팅방 선택"); - String name = reader.readLine(); - try { - channelService.updateName(currentuser, channelService.findByName(currentuser, name).get(0).getId()); - } catch (NoSuchElementException e) { - System.out.println("해당 채팅방이 존재하지 않습니다."); - } + channelService.updateName(currentChannel.getId(), "두번째 채팅방 -> 잡담방으로 변경함"); + System.out.println("-----------------------"); // Check updated channel information (수정된 데이터 조회) - channelService.findAll(currentuser).forEach(System.out::println); - System.out.println("======================="); + channelService.findAll().forEach(System.out::println); - // Remove second channel - System.out.println("채팅방 삭제"); + // Remove channel (채팅방 삭제) System.out.println("삭제할 채팅방 선택"); - try { - channelService.delete(currentuser, channelService.findByName(currentuser, reader.readLine()).get(0).getId()); - } catch (IllegalArgumentException e) { - System.out.println("해당 채팅방이 존재하지 않습니다."); - } - System.out.println("======================="); + System.out.println("첫번째 채팅방 삭제"); + channelService.delete(channelService.findAll().get(0).getId()); + System.out.println("-----------------------"); - // Show all users after deletion System.out.println("삭제 후 채팅방 목록 확인"); - channelService.findAll(currentuser).forEach(System.out::println); - System.out.println("======================="); + channelService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); - //// 3) Message 도메인 - // 채팅방 선택 - System.out.println("어느 채팅방에 입장하시겠습니까?"); - channelService.findAll(currentuser).forEach(System.out::println); System.out.println("======================="); - String channelname = reader.readLine(); - Channel currentchannel = channelService.findByName(currentuser, channelname).get(0); - System.out.println(currentchannel.getName() + " 입장!"); - - System.out.println("------------------------"); - System.out.println("'" + currentuser.getName() + "' 님이 입장하셨습니다."); + //// 3) Message 도메인 // Create messages (등록) System.out.println("(메시지 등록 종료: X)"); System.out.println("-----------------------"); - boolean isEnded = false; - while (!isEnded) { - String input = reader.readLine(); - if (input.equalsIgnoreCase("X")) { - isEnded = true; - } else { - messageService.create(currentuser, currentchannel, input); - System.out.println(messageService.find(currentuser, currentchannel, messageService.readAll(currentuser, currentchannel).get(messageService.readAll(currentuser, currentchannel).size()-1).getId()).toString()); - } - } - System.out.println("----------------------"); - System.out.println("여기까지 읽으셨습니다."); + messageService.create(currentUser.getId(), currentChannel.getId(), "하이요!"); + messageService.create(currentUser.getId(), currentChannel.getId(), "^^"); + messageService.create(currentUser.getId(), currentChannel.getId(), "반가워요~~~~~"); + messageService.create(currentUser.getId(), currentChannel.getId(), "좋은하루되세여!!!"); + messageService.create(currentUser.getId(), currentChannel.getId(), "ㅎㄱ ㄷㄱㄷㄱ"); + + // Show all messages (다건 조회) + System.out.println("메시지 전체 조회"); + messageService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); // Search message by text (단건 조회) System.out.println("메시지 검색"); - String searchWord = reader.readLine(); - messageService.findByText(currentuser, currentchannel, searchWord).forEach(System.out::println); - System.out.println("======================="); + messageService.findByText("ㄷㄱㄷㄱ").forEach(System.out::println); + System.out.println("-----------------------"); // Update message (수정) - System.out.println("마지막 메시지 변경"); - messageService.update(currentuser, currentchannel, messageService.readAll(currentuser, currentchannel).get(messageService.readAll(currentuser, currentchannel).size()-1).getId(),reader.readLine()); - - // Check updated message (수정된 데이터 조회) - messageService.find(currentuser, currentchannel, messageService.readAll(currentuser, currentchannel).get(messageService.readAll(currentuser, currentchannel).size()-1).getId()); - System.out.println("======================="); + System.out.println("다섯번째 메시지 변경"); + messageService.update(messageService.findAll().get(4).getId(), "듀근듀근!!"); - // 메시지 등록 - System.out.println("(메시지 등록 종료: X)"); + // 변경된 메시지 확인 + System.out.println(messageService.find(messageService.findAll().get(4).getId()).toString()); System.out.println("-----------------------"); - isEnded = false; - while (!isEnded) { - String input = reader.readLine(); - if (input.equalsIgnoreCase("X")) { - isEnded = true; - } else { - messageService.create(currentuser, currentchannel, input); - System.out.println(messageService.find(currentuser, currentchannel, messageService.readAll(currentuser, currentchannel).get(messageService.readAll(currentuser, currentchannel).size()-1).getId()).toString()); - } - } - System.out.println("----------------------"); - System.out.println("여기까지 읽으셨습니다."); - - // Show all messages (다건 조회) - System.out.println("메시지 전체 조회"); - messageService.readAll(currentuser, currentchannel).forEach(System.out::println); - System.out.println("======================="); - // Remove last message - System.out.println("마지막 메시지 삭제"); - messageService.delete(currentuser, currentchannel, messageService.readAll(currentuser, currentchannel).get(messageService.readAll(currentuser, currentchannel).size()-1).getId()); - System.out.println("======================="); + // Remove message (메시지 삭제) + System.out.println("두번째 메시지 삭제"); + messageService.delete(messageService.findAll().get(1).getId()); - // Show all users after deletion - System.out.println("삭제 후 전체 메시지 확인"); - messageService.readAll(currentuser, currentchannel).forEach(System.out::println); - System.out.println("======================="); + // 메시지 삭제 확인 + messageService.findAll().forEach(System.out::println); + System.out.println("-----------------------"); } } diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 00000000..d647e8de --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,44 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +@Service +public class AuthService { + private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + private final UserRepository userRepository; + + public AuthService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + public User login(String username, String password) throws IOException, IllegalAccessException { + + if (userRepository.existsUsername(username)) { + User user = userRepository.findByUsername(username); + + if (user.getPassword().equals(password)) { + + return user; + } else { + + throw new IllegalAccessException("비밀번호가 틀립니다."); + } + } else { + + throw new NoSuchElementException("존재하지 않는 사용자입니다."); + } + + } + +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 4f13f8e9..efd1127a 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,21 +1,27 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.PrivateChannelCreateDTO; +import com.sprint.mission.discodeit.dto.PublicChannelCreateDTO; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.service.UserService; +import org.springframework.stereotype.Service; import java.io.IOException; import java.util.List; import java.util.UUID; public interface ChannelService { - Channel create(User user) throws IOException; - Channel find(User user, UUID id) throws IOException; - List findByName(User user, String name); - List findAll(User user); - void addEntry(User user, UUID id, UUID entryId); - Channel enterChannel(User user, UUID id) throws IOException; - void updateName(User user, UUID id) throws IOException; - void delete(User user, UUID id); + // id = channel ID + Channel create(PrivateChannelCreateDTO dto) throws IOException; + Channel create(PublicChannelCreateDTO dto) throws IOException; + Channel find(UUID id) throws IOException; + List findByName(String name); + List findAll(); + void addEntry(UUID id, UUID entryId); + void addEntry(UUID id, List entryIds); +// Channel enterChannel(UUID user, UUID id) throws IOException; + void updateName(UUID id, String name) throws IOException; + void delete(UUID id) throws IOException; } diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index bd4e7bf6..f9fa3007 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,16 +1,19 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.entity.*; +import org.springframework.stereotype.Service; +import java.io.IOException; import java.util.List; import java.util.UUID; public interface MessageService { - Message create(User user, Channel channel, String text); - List readAll(User user, Channel channel); - Message find(User user, Channel channel, UUID id); - List findByText(User user, Channel channel, String text); - void update(User user, Channel channel, UUID id, String text); - void delete(User user, Channel channel, UUID id); + // id = message ID + Message create(UUID user, UUID channel, String text); + List findAllByChannelId(UUID channel); + Message find(UUID id); + List findByText(String text); + void update(UUID id, String text); + void delete(UUID id) throws IOException; } diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 31a6cc38..edbedf26 100644 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -6,16 +6,19 @@ import java.util.UUID; import com.sprint.mission.discodeit.entity.User; +import org.springframework.stereotype.Service; public interface UserService { - User create() throws IOException; + + User create(String username, String email, String password, String name) throws IOException; User find(UUID id); - User findByUserId(String userid); + User findByUsername(String username); List findByName(String name); + User findByEmail(String email); List findAll(); - User update(UUID id) throws IOException; - void delete(UUID id); - // Login, Logout 메소드 - User login() throws IOException; - void logout(User user); -} + void updateName(UUID id, String name) throws IOException, IllegalAccessException; + void updatePassword(UUID id, String password) throws IOException, IllegalAccessException; + void updateEmail(UUID id, String email) throws IOException, IllegalAccessException; + void updateProfile(UUID id, UUID profileId) throws IOException, IllegalAccessException; + void delete(UUID id) throws IOException, IllegalAccessException; +} \ No newline at end of file diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java new file mode 100644 index 00000000..75791406 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -0,0 +1,100 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.PrivateChannelCreateDTO; +import com.sprint.mission.discodeit.dto.PublicChannelCreateDTO; +import com.sprint.mission.discodeit.dto.ReadStatusCreateDTO; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +@Service +public class BasicChannelService implements ChannelService { + private final ChannelRepository channelRepository; + private final ReadStatusRepository readStatusRepository; + + public BasicChannelService(ChannelRepository channelRepository, ReadStatusRepository readStatusRepository) { + this.channelRepository = channelRepository; + this.readStatusRepository = readStatusRepository; + } + + @Override + public Channel create(PrivateChannelCreateDTO dto) throws IOException { + UUID userId = dto.userId(); + String channelName = dto.channalName(); + List userIds = dto.entry(); + Channel channel = new Channel(userId, channelName, true); + channel.addEntry(userIds); + this.channelRepository.save(channel); + + for (UUID id : userIds) { + ReadStatus readStatus = new ReadStatus(id, channel.getId()); + readStatusRepository.save(readStatus); + } + + return channel; + } + + @Override + public Channel create(PublicChannelCreateDTO dto) throws IOException { + UUID userId = dto.userId(); + String channelName = dto.channalName(); + + Channel channel = new Channel(userId, channelName, false); + + this.channelRepository.save(channel); + return channel; + } + + @Override + public Channel find(UUID id){ + + return this.channelRepository.find(id); + } + + @Override + public List findByName(String name) { + + return this.channelRepository.findByName(name); + } + + @Override + public List findAll() { + + return this.channelRepository.findAll(); + } + + @Override + public void updateName(UUID id, String newname) throws IOException { + Channel channel = find(id); + channel.updateName(newname); + this.channelRepository.save(channel); + } + + @Override + public void addEntry(UUID id, UUID userId) { + Channel channel = find(id); + channel.addEntry(userId); + this.channelRepository.save(channel); + } + + @Override + public void addEntry(UUID id, List userIds) { + Channel channel = find(id); + channel.addEntry(userIds); + this.channelRepository.save(channel); + } + + @Override + public void delete(UUID id) throws IOException { + this.channelRepository.delete(id); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java new file mode 100644 index 00000000..0eaabb3e --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.service.MessageService; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service +public class BasicMessageService implements MessageService { + private final MessageRepository messageRepository; + + public BasicMessageService(MessageRepository messageRepository) { + this.messageRepository = messageRepository; + } + + @Override + public Message create(UUID currentUser, UUID currentChannel, String text) { + Message message = new Message(currentUser, currentChannel, text); + this.messageRepository.save(message); + return message; + } + + @Override + public List findAllByChannelId(UUID currentChannel) { + + return this.messageRepository.findAllFromChannel(currentChannel); + } + + @Override + public Message find(UUID id) { + + return this.messageRepository.find(id); + }; + + @Override + public List findByText(String text) { + + return this.messageRepository.findByText(text); + } + + @Override + public void update(UUID id, String text) { + Message message = this.messageRepository.find(id); + message.updateText(text); + this.messageRepository.save(message); + } + + @Override + public void delete(UUID id) throws IOException { + this.messageRepository.delete(id); + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java new file mode 100644 index 00000000..a9fc53f3 --- /dev/null +++ b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -0,0 +1,167 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.service.UserService; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class BasicUserService implements UserService { + private final static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + private final UserRepository userRepository; + private final UserStatusRepository userStatusRepository; + private final BinaryContentRepository binaryContentRepository; + + public BasicUserService(UserRepository userRepository, UserStatusRepository userStatusRepository, Optional binaryContentRepository) { + this.userRepository = userRepository; + this.userStatusRepository = userStatusRepository; + this.binaryContentRepository = binaryContentRepository.orElse(null); + + } + + @Override + public User create(String username, String email, String password, String name) throws IOException { + if (!isDuplicated(username) && !isDuplicated(email)) { + User newUser = new User(username, email, password, name); + + userRepository.save(newUser); + return newUser; + } else { + throw new IllegalArgumentException("이미 존재하는 사용자 입니다."); + } + } + + // 아이디, 이메일 중복체크 + public boolean isDuplicated(String args) { + return userRepository.findAll().stream() + .anyMatch(u -> u.getUsername().equals(args) || u.getEmail().equals(args)); + } + + @Override + public User find(UUID id) { + if (userRepository.existsId(id)) { + return userRepository.find(id); + } else { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + + } + + @Override + public User findByUsername(String username) { + if (userRepository.existsUsername(username)) { + return userRepository.findByUsername(username); + } else { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + } + + @Override + public List findByName(String name) { + if (userRepository.existsName(name)) { + return userRepository.findByName(name); + } else { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + } + + @Override + public User findByEmail(String email) { + if (userRepository.existsEmail(email)) { + return userRepository.findByEmail(email); + } else { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + } + + @Override + public List findAll() { + return userRepository.findAll(); + } + + @Override + public void updateName(UUID id, String newName) throws IOException, IllegalAccessException { + if (userRepository.existsId(id)) { + User user = userRepository.find(id); + user.updateName(newName); + userRepository.save(user); + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } else { + throw new IllegalArgumentException("잘못된 접근입니다."); + } + + } + + public boolean checkUser(UUID id) throws IllegalAccessException { + if (userRepository.existsId(id)) { + return true; + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } else { + throw new IllegalArgumentException("잘못된 접근입니다."); + } + } + + @Override + public void updateEmail(UUID id, String newEmail) throws IOException, IllegalAccessException { + if (userRepository.existsId(id)) { + User user = userRepository.find(id); + user.updateEmail(newEmail); + userRepository.save(user); + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } else { + throw new IllegalArgumentException("잘못된 접근입니다."); + } + } + + @Override + public void updatePassword(UUID id, String newPassword) throws IOException, IllegalAccessException { + if (userRepository.existsId(id)) { + User user = userRepository.find(id); + user.updatePassword(newPassword); + userRepository.save(user); + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + + } + + @Override + public void updateProfile(UUID id, UUID newProfileId) throws IOException, IllegalAccessException { + if (userRepository.existsId(id)) { + User user = userRepository.find(id); + user.updateProfile(newProfileId); + userRepository.save(user); + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } + + } + + @Override + public void delete(UUID id) throws IOException, IllegalAccessException { + if (userRepository.existsId(id)) { + userRepository.delete(id); + + // 관련 도메인 삭제 + binaryContentRepository.deleteByUserId(id); + userStatusRepository.deleteByUserId(id); + + } else if (!userRepository.existsId(id)) { + throw new NoSuchElementException("해당 사용자가 존재하지 않습니다."); + } else { + throw new IllegalArgumentException("잘못된 접근입니다."); + } + } +} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java deleted file mode 100644 index 81d599cb..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.entity.Channel; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; -import java.util.stream.Collectors; - -public class FileChannelService implements ChannelService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private static final Path directory = Paths.get(System.getProperty("user.dir"),"data"); - private static final Path filepath = Paths.get(String.valueOf(directory), "channels.ser"); - private List data; - - public FileChannelService() throws IOException { - init(directory); - this.data = load(filepath); - } - - // 저장할 경로의 파일 초기화 - public static void init(Path directory) { - if (!Files.exists(directory)) { - try { - Files.createDirectories(directory); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - public static void save(T data) { - try( - FileOutputStream fos = new FileOutputStream(filepath.toFile()); - ObjectOutputStream oos = new ObjectOutputStream(fos); - ) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static List load(Path filepath) throws IOException { - if (!Files.exists(filepath)) { - return new ArrayList<>(); - } - - try ( - FileInputStream fis = new FileInputStream(filepath.toFile()); - ObjectInputStream ois = new ObjectInputStream(fis) - ) { - Object data = ois.readObject(); - return (List) data; - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("파일 로딩 실패", e); - } - } - - @Override - public Channel create(User currentUser) throws IOException { - - System.out.println("새로 만들 채팅방 이름을 입력하십시오."); - String name = reader.readLine(); - - Channel channel = new Channel(currentUser.getId(), name); - - this.data.add(channel); - System.out.println("채팅방이 생성되었습니다."); - - save(this.data); - return channel; - } - - @Override - public Channel find(User currentUser, UUID id){ - - return findAll(currentUser).stream() - .filter(c -> c.getId().equals(id)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("해당 채팅방이 없습니다.")); - } - - @Override - public List findByName(User currentUser, String name) { - - return findAll(currentUser).stream() - .filter(c -> c.getName().contains(name)) - .collect(Collectors.toList()); - } - - @Override - public List findAll(User currentUser) { - - return this.data.stream() - .filter(c -> c.getEntry().contains(currentUser.getId())) - .collect(Collectors.toList()); - } - - @Override - public void updateName(User currentUser, UUID id) throws IOException { - Channel channel = find(currentUser, id); - - System.out.println("새로운 이름을 입력하십시오."); - String newname = reader.readLine(); - - channel.updateById(id, newname); - System.out.println("수정되었습니다."); - - save(this.data); - } - - @Override - public void delete(User currentUser, UUID id) { - Channel channel = find(currentUser, id); - - if (currentUser.getId().equals(channel.getMaker())) { - - this.data.removeIf(c -> c.getId().equals(id)); - System.out.println("채팅방이 삭제되었습니다."); - - save(this.data); - - } else { - System.out.println("삭제 권한이 없습니다."); - } - } - - @Override - public void addEntry(User currentUser, UUID id, UUID entryId) { - Channel channel = find(currentUser, id); - - if (!channel.getEntry().contains(entryId)) { - channel.addEntry(entryId); - System.out.println("추가되었습니다."); - - save(this.data); - } else { - System.out.println("이미 추가된 사용자입니다."); - } - - System.out.println("-----{"+channel.getName()+"} 참가자 목록-----"); - - System.out.println(channel.getEntry().toString()); - - System.out.println("----------------------"); - } - - @Override - public Channel enterChannel(User currentUser, UUID id) throws IOException{ - List channels = findAll(currentUser); - - if (channels.stream().anyMatch(c -> c.getId().equals(id))) { - - Channel channel = find(currentUser, id); - System.out.println(channel.getName() + "에 입장!"); - - return channel; - } else { - System.out.println("해당 채팅방이 없습니다."); - return null; - } - } -} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java deleted file mode 100644 index 47e8ae77..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -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.MessageService; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -public class FileMessageService implements MessageService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private static final Path directory = Paths.get(System.getProperty("user.dir"),"data"); - private static final Path filepath = Paths.get(String.valueOf(directory), "messages.ser"); - private List data; - - public FileMessageService() throws IOException { - init(directory); - this.data = load(filepath); - } - - // 저장할 경로의 파일 초기화 - public static void init(Path directory) { - if (!Files.exists(directory)) { - try { - Files.createDirectories(directory); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - public static void save(T data) { - try( - FileOutputStream fos = new FileOutputStream(filepath.toFile()); - ObjectOutputStream oos = new ObjectOutputStream(fos); - ) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static List load(Path filepath) { - if (!Files.exists(filepath)) { - return new ArrayList<>(); - } - - try ( - FileInputStream fis = new FileInputStream(filepath.toFile()); - ObjectInputStream ois = new ObjectInputStream(fis) - ) { - Object data = ois.readObject(); - return (List) data; - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("파일 로딩 실패", e); - } - } - - @Override - public Message create(User currentUser, Channel currentChannel, String text) { - Message message = null; - - if (currentUser.getIsLogin() && currentChannel != null) { - message = new Message(currentUser.getId(), currentChannel.getId(), text); - this.data.add(message); - - save(this.data); - - } else if (!currentUser.getIsLogin()) { - System.out.println("먼저 로그인하십시오."); - - } else { - System.out.println("잘못된 접근입니다."); - - } - - return message; - } - - @Override - public List readAll(User currentUser, Channel currentChannel) { - List messages = null; - - if (currentUser.getIsLogin() && currentChannel != null) { - messages = this.data.stream() - .filter(m -> m.getChannel().equals(currentChannel.getId())) - .collect(Collectors.toList()); - - } else if (!currentUser.getIsLogin()) { - System.out.println("먼저 로그인하십시오."); - - } else if (currentChannel == null) { - - System.out.println("잘못된 접근입니다."); - } - - return messages; - } - - @Override - public Message find(User currentUser, Channel currentChannel, UUID id) { - - return readAll(currentUser, currentChannel).stream() - .filter(m -> m.getId().equals(id)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("해당 메시지는 존재하지 않습니다.")); - }; - - @Override - public List findByText(User currentUser, Channel currentChannel, String text) { - - return readAll(currentUser, currentChannel).stream() - .filter(m -> m.getText().contains(text)) - .collect(Collectors.toList()); - } - - @Override - public void update(User currentUser, Channel currentChannel, UUID id, String text) { - Message message = find(currentUser, currentChannel, id); - - if (message.getSender().equals(currentUser.getId())) { - message.updateText(id, text); - - save(this.data); - - } else { - System.out.println("권한이 없습니다."); - } - } - - @Override - public void delete(User currentUser, Channel currentChannel, UUID id) { - Message message = find(currentUser, currentChannel, id); - - if (message.getSender().equals(currentChannel.getId())) { - this.data.removeIf(m -> m.getId().equals(id)); - - save(this.data); - - } else { - System.out.println("권한이 없습니다."); - } - } - -} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java deleted file mode 100644 index 6b144ba3..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ /dev/null @@ -1,187 +0,0 @@ -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.UserService; - -import java.io.*; -import java.nio.file.*; -import java.util.*; -import java.util.stream.Collectors; - -public class FileUserService implements UserService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private static final Path directory = Paths.get(System.getProperty("user.dir"),"data"); - private static final Path filepath = Paths.get(String.valueOf(directory), "users.ser"); - private List data; - - public FileUserService() throws IOException { - init(directory); - this.data = load(filepath); - } - - // 저장할 경로의 파일 초기화 - public static void init(Path directory) { - if (!Files.exists(directory)) { - try { - Files.createDirectories(directory); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - public static void save(T data) { - try( - FileOutputStream fos = new FileOutputStream(filepath.toFile()); - ObjectOutputStream oos = new ObjectOutputStream(fos); - ) { - oos.writeObject(data); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static List load(Path filepath) throws IOException { - if (!Files.exists(filepath)) { - return new ArrayList<>(); - } - - try ( - FileInputStream fis = new FileInputStream(filepath.toFile()); - ObjectInputStream ois = new ObjectInputStream(fis) - ) { - Object data = ois.readObject(); - return (List) data; - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("파일 로딩 실패", e); - } - } - - @Override - public User create() throws IOException { - while (true) { - System.out.println("ID: "); - String userid = reader.readLine(); - - // 아이디 중복체크 - boolean isDuplicated = this.data.stream() - .anyMatch(u -> u.getUserId().equals(userid)); - if (isDuplicated) { - System.out.println("이미 존재하는 아이디입니다."); - } else { - - System.out.println("Password: "); - String password = reader.readLine(); - - System.out.println("Name: "); - String name = reader.readLine(); - - User newUser = new User(userid, password, name); - this.data.add(newUser); - System.out.println("사용자 등록 완료: " + userid); - - save(this.data); - return newUser; - } - } - } - - @Override - public User find(UUID id) { - return this.data.stream() - .filter(u -> u.getId().equals(id)) - .findFirst().orElseThrow(NoSuchElementException::new); - } - - @Override - public User findByUserId(String userid) { - return this.data.stream() - .filter(u -> u.getUserId().equals(userid)) - .findFirst().orElseThrow(NoSuchElementException::new); - } - - public List findByName(String name) { - return this.data.stream() - .filter(u -> u.getName().contains(name)) - .collect(Collectors.toList()); - } - - @Override - public List findAll() { - return this.data; - } - - @Override - public User update(UUID id) throws IOException { - User user = this.data.stream() - .filter(u -> u.getId().equals(id)) - .findFirst() - .orElseThrow(NoSuchElementException::new); - - if (user.getIsLogin()) { - System.out.println("사용자 정보 수정"); - System.out.println("1: 이름"); - System.out.println("2: 비밀번호"); - System.out.println("======================="); - System.out.println("수정할 정보의 번호를 입력하세요: "); - - String num = String.valueOf(reader.readLine()); - if (num.equals("1")) { - System.out.println("새로운 정보 입력"); - String name = reader.readLine(); - user.updateName(name); - } else if (num.equals("2")) { - System.out.println("새로운 정보 입력"); - String password = reader.readLine(); - user.updatePassword(password); - } else { - System.out.println("유효한 값을 입력하세요."); - } - - } else { - System.out.println("먼저 로그인하십시오."); - } - - save(this.data); - return user; - } - - @Override - public void delete(UUID id) { - this.data.removeIf(u -> u.getId().equals(id)); - System.out.println("삭제되었습니다."); - save(this.data); - } - - @Override - public User login() throws IOException { - System.out.println("ID: "); - String userid = reader.readLine(); - - System.out.println("Password: "); - String password = reader.readLine(); - - User user = this.data.stream() - .filter(u -> u.getUserId().equals(userid) && u.getPassword().equals(password)) - .findFirst() - .orElseThrow(NoSuchElementException::new); - - user.setLogin(); - System.out.println("로그인 성공!"); - - return user; - } - - @Override - public void logout(User user) { - - if (user.getIsLogin()) { - user.setLogout(); - System.out.println("로그아웃 되었습니다."); - } else { - System.out.println("이미 로그아웃 되었습니다.."); - } - } - -} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java deleted file mode 100644 index d3706145..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.*; -import java.util.stream.*; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; - -public class JCFChannelService implements ChannelService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private final List data; - public JCFChannelService(){ - this.data = new ArrayList<>(); - } - - @Override - public Channel create(User currentUser) throws IOException { - - System.out.println("새로 만들 채팅방 이름을 입력하십시오."); - String name = reader.readLine(); - - Channel channel = new Channel(currentUser.getId(), name); - - this.data.add(channel); - System.out.println("채팅방이 생성되었습니다."); - - return channel; - } - - @Override - public Channel find(User currentUser, UUID id) { - - return findAll(currentUser).stream() - .filter(c -> c.getId().equals(id)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("해당 채팅방이 없습니다.")); - } - - @Override - public List findAll(User currentUser) { - - return this.data.stream() - .filter(c -> c.getEntry().contains(currentUser.getId())) - .collect(Collectors.toList()); - } - - public List findByName(User currentUser, String name) { - - return findAll(currentUser).stream() - .filter(c -> c.getName().contains(name)) - .collect(Collectors.toList()); - } - - @Override - public void updateName(User currentUser, UUID id) throws IOException { - Channel channel = find(currentUser, id); - - System.out.println("새로운 이름을 입력하십시오."); - String newname = reader.readLine(); - - channel.updateById(id, newname); - System.out.println("수정되었습니다."); - } - - @Override - public void delete(User currentUser, UUID id) { - Channel channel = find(currentUser, id); - - if (currentUser.getId().equals(channel.getMaker())) { - - this.data.removeIf(c -> c.getId().equals(id)); - System.out.println("채팅방이 삭제되었습니다."); - - } else { - System.out.println("삭제 권한이 없습니다."); - } - } - - @Override - public void addEntry(User currentUser, UUID id, UUID entryId) { - Channel channel = find(currentUser, id); - - if (!channel.getEntry().contains(entryId)) { - channel.addEntry(entryId); - System.out.println("추가되었습니다."); - } else { - System.out.println("이미 추가된 사용자입니다."); - } - - System.out.println("-----{"+channel.getName()+"} 참가자 목록-----"); - - System.out.println(channel.getEntry().toString()); - - System.out.println("----------------------"); - } - - @Override - public Channel enterChannel(User currentUser, UUID id) throws IOException{ - List channels = findAll(currentUser); - - if (channels.stream().anyMatch(c -> c.getId().equals(id))) { - - Channel channel = find(currentUser, id); - System.out.println(channel.getName() + "에 입장!"); - - return channel; - } else { - System.out.println("해당 채팅방이 없습니다."); - return null; - } - } -} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java deleted file mode 100644 index 00bb7b34..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.*; -import java.util.stream.Collectors; - -import com.sprint.mission.discodeit.entity.*; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -public class JCFMessageService implements MessageService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private final List data; - public JCFMessageService(){ - data = new ArrayList<>(); - } - - @Override - public Message create(User currentUser, Channel currentChannel, String text) { - Message message = null; - - if (currentUser.getIsLogin() && currentChannel != null) { - message = new Message(currentUser.getId(), currentChannel.getId(), text); - this.data.add(message); - - } else if (!currentUser.getIsLogin()) { - System.out.println("먼저 로그인하십시오."); - - } else { - System.out.println("잘못된 접근입니다."); - - } - - return message; - } - - @Override - public List readAll(User currentUser, Channel currentChannel) { - List messages = null; - - if (currentUser.getIsLogin() && currentChannel != null) { - messages = this.data.stream() - .filter(m -> m.getChannel().equals(currentChannel.getId())) - .collect(Collectors.toList()); - - } else if (!currentUser.getIsLogin()) { - System.out.println("먼저 로그인하십시오."); - - } else if (currentChannel == null) { - - System.out.println("잘못된 접근입니다."); - } - - return messages; - } - - @Override - public Message find(User currentUser, Channel currentChannel, UUID id) { - - return readAll(currentUser, currentChannel).stream() - .filter(m -> m.getId().equals(id)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("해당 메시지는 존재하지 않습니다.")); - } - - public List findByText(User currentUser, Channel currentChannel, String text) { - - return readAll(currentUser, currentChannel).stream() - .filter(m -> m.getText().contains(text)) - .collect(Collectors.toList()); - } - - @Override - public void update(User currentUser, Channel currentChannel, UUID id, String text) { - Message message = find(currentUser, currentChannel, id); - - if (message.getSender().equals(currentUser.getId())) { - message.updateText(id, text); - } else { - System.out.println("권한이 없습니다."); - } - } - - @Override - public void delete(User currentUser, Channel currentChannel, UUID id) { - Message message = find(currentUser, currentChannel, id); - - if (message.getSender().equals(currentChannel.getId())) { - this.data.removeIf(m -> m.getId().equals(id)); - } else { - System.out.println("권한이 없습니다."); - } - } -} diff --git a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java deleted file mode 100644 index c3e267e7..00000000 --- a/3-sprint-mission/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; -import java.util.stream.*; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.IOException; - -public class JCFUserService implements UserService { - private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - private final List data; - - public JCFUserService(){ - this.data = new ArrayList<>(); - } - - @Override - public User create() throws IOException { - User newUser = null; - boolean isFinished = false; - while (!isFinished) { - System.out.println("ID: "); - String userid = reader.readLine(); - - // 아이디 중복체크 - boolean isDuplicated = this.findAll().stream() - .anyMatch(u -> u.getUserId().equals(userid)); - if (isDuplicated) { - System.out.println("이미 존재하는 아이디입니다."); - } else { - - System.out.println("Password: "); - String password = reader.readLine(); - - System.out.println("Name: "); - String name = reader.readLine(); - - newUser = new User(userid, password, name); - this.data.add(newUser); - System.out.println("사용자 등록 완료: " + userid); - isFinished = true; - } - } - return newUser; - } - - @Override - public User find(UUID id) { - return this.data.stream() - .filter(u -> u.getId().equals(id)) - .findFirst().orElseThrow(NoSuchElementException::new); - } - - @Override - public User findByUserId(String userid) { - return this.data.stream() - .filter(u -> u.getUserId().equals(userid)) - .findFirst().orElseThrow(NoSuchElementException::new); - } - - public List findByName(String name) { - return this.data.stream() - .filter(u -> u.getName().contains(name)) - .collect(Collectors.toList()); - } - - @Override - public List findAll() { - return this.data; - } - - @Override - public User update(UUID id) throws IOException { - User user = this.data.stream() - .filter(u -> u.getId().equals(id)) - .findFirst() - .orElseThrow(NoSuchElementException::new); - - if (user.getIsLogin()) { - System.out.println("사용자 정보 수정"); - System.out.println("1: 이름"); - System.out.println("2: 비밀번호"); - System.out.println("======================="); - System.out.println("수정할 정보의 번호를 입력하세요: "); - - String num = String.valueOf(reader.readLine()); - if (num.equals("1")) { - System.out.println("새로운 정보 입력"); - String name = reader.readLine(); - user.updateName(name); - } else if (num.equals("2")) { - System.out.println("새로운 정보 입력"); - String password = reader.readLine(); - user.updatePassword(password); - } else { - System.out.println("유효한 값을 입력하세요."); - } - - } else { - System.out.println("먼저 로그인하십시오."); - } - - return user; - } - - @Override - public void delete(UUID id) { - this.data.removeIf(u -> u.getId().equals(id)); - System.out.println("삭제되었습니다."); - } - - @Override - public User login() throws IOException { - System.out.println("ID: "); - String userid = reader.readLine(); - System.out.println("Password: "); - String password = reader.readLine(); - - User user = this.data.stream() - .filter(u -> u.getUserId().equals(userid) && u.getPassword().equals(password)) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - - user.setLogin(); - System.out.println("로그인 성공!"); - - return user; - } - - @Override - public void logout(User user) { - System.out.println(this.findByUserId(user.getUserId()).toString()); - if (this.findByUserId(user.getUserId()) != null) { - user.setLogout(); - System.out.println("로그아웃 되었습니다."); - } else { - System.out.println("존재하지 않는 사용자입니다."); - } - } - -} diff --git a/3-sprint-mission/src/main/resources/application.yaml b/3-sprint-mission/src/main/resources/application.yaml new file mode 100644 index 00000000..7c9cdfb2 --- /dev/null +++ b/3-sprint-mission/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +#spring.application.name=discodeit +server: + port: 8080 diff --git a/3-sprint-mission/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/3-sprint-mission/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java new file mode 100644 index 00000000..3a987a21 --- /dev/null +++ b/3-sprint-mission/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() { + } + +}