diff --git a/.gitignore b/.gitignore
index 43e6c09a..693174ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,42 +1,145 @@
-.gradle
-build/
-!gradle/wrapper/gradle-wrapper.jar
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### IntelliJ IDEA ###
-.idea
+# Created by https://www.toptal.com/developers/gitignore/api/java,windows,intellij+all
+# Edit at https://www.toptal.com/developers/gitignore?templates=java,windows,intellij+all
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+.gradle/
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
*.iws
-*.iml
-*.ipr
+
+# IntelliJ
out/
-!**/src/main/**/out/
-!**/src/test/**/out/
-
-### Eclipse ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-bin/
-!**/src/main/**/bin/
-!**/src/test/**/bin/
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-
-### VS Code ###
-.vscode/
-
-### Mac OS ###
-.DS_Store
-
-### Discodeit ###
-.discodeit
\ No newline at end of file
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignore everything but code style settings and run configurations
+# that are supposed to be shared within teams.
+
+.idea/*
+
+!.idea/codeStyles
+!.idea/runConfigurations
+
+### Java ###
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+replay_pid*
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# End of https://www.toptal.com/developers/gitignore/api/java,windows,intellij+all
\ No newline at end of file
diff --git a/HELP.md b/HELP.md
index 42c5f002..25ee0b53 100644
--- a/HELP.md
+++ b/HELP.md
@@ -1,14 +1,17 @@
# 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.0/gradle-plugin)
-* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin/packaging-oci-image.html)
-* [Spring Web](https://docs.spring.io/spring-boot/3.4.0/reference/web/servlet.html)
+* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.5.13/gradle-plugin)
+* [Create an OCI image](https://docs.spring.io/spring-boot/3.5.13/gradle-plugin/packaging-oci-image.html)
+* [Spring Boot DevTools](https://docs.spring.io/spring-boot/3.5.13/reference/using/devtools.html)
+* [Spring Web](https://docs.spring.io/spring-boot/3.5.13/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/)
@@ -16,6 +19,7 @@ The following guides illustrate how to use some features concretely:
* [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/README.md b/README.md
index 815bede5..bad90755 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
-# 0-spring-mission
-스프린트 미션 모범 답안 리포지토리입니다.
+# README 샘플입니다.
+
+---
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 20c6762a..2d991724 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,40 +1,35 @@
plugins {
- id 'java'
- id 'org.springframework.boot' version '3.4.0'
- id 'io.spring.dependency-management' version '1.1.6'
+ id 'java'
+ id 'org.springframework.boot' version '3.5.13'
+ id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.sprint.mission'
version = '0.0.1-SNAPSHOT'
+description = 'discodeit'
java {
- toolchain {
- languageVersion = JavaLanguageVersion.of(17)
- }
-}
-
-configurations {
- compileOnly {
- extendsFrom annotationProcessor
- }
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(17)
+ }
}
repositories {
- mavenCentral()
+ mavenCentral()
}
dependencies {
- implementation 'org.springframework.boot:spring-boot-starter-web'
- implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
- implementation 'org.springframework.boot:spring-boot-starter-actuator'
- compileOnly 'org.projectlombok:lombok'
- annotationProcessor 'org.projectlombok:lombok'
- testImplementation 'org.springframework.boot:spring-boot-starter-test'
- developmentOnly 'org.springframework.boot:spring-boot-devtools'
- testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
-
+ implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-actuator'
+ compileOnly 'org.projectlombok:lombok'
+ developmentOnly 'org.springframework.boot:spring-boot-devtools'
+ annotationProcessor 'org.projectlombok:lombok'
+ testImplementation 'org.springframework.boot:spring-boot-starter-test'
+ testCompileOnly 'org.projectlombok:lombok'
+ testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+ testAnnotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
- useJUnitPlatform()
+ useJUnitPlatform()
}
diff --git a/discodeit.iml b/discodeit.iml
new file mode 100644
index 00000000..482334b9
--- /dev/null
+++ b/discodeit.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index a4b76b95..1b33c55b 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index e2847c82..aaaabb3c 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index f5feea6d..23d15a93 100644
--- a/gradlew
+++ b/gradlew
@@ -86,8 +86,7 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# 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
-' "$PWD" ) || exit
+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
@@ -115,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -206,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# * 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.
@@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
- org.gradle.wrapper.GradleWrapperMain \
+ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
diff --git a/gradlew.bat b/gradlew.bat
index 9d21a218..db3a6ac2 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -70,11 +70,11 @@ goto fail
:execute
@rem Setup the command line
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+set CLASSPATH=
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
index 8f61230d..8b162e8e 100644
--- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
+++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
@@ -1,12 +1,191 @@
package com.sprint.mission.discodeit;
+import com.sprint.mission.discodeit.dto.*;
+import com.sprint.mission.discodeit.service.*;
+
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
@SpringBootApplication
public class DiscodeitApplication {
- public static void main(String[] args) {
- SpringApplication.run(DiscodeitApplication.class, args);
- }
+ static List setupUser(UserService userService) {
+ List users = new ArrayList<>();
+ for (int i = 1; i <= 5; i++) {
+ users.add(userService.create(
+ new UserCreateRequest(
+ "woody" + i,
+ "woody" + i + "@gmail.com",
+ "Nick" + i,
+ "1234",
+ null,
+ null)
+ ));
+ System.out.println(
+ "유저 생성: " + users.get(i - 1).id()
+ + "\n닉네임: " + users.get(i - 1).nickname()
+ );
+ System.out.println();
+ }
+
+ return users;
+ }
+
+ static ChannelResponse setupPublicChannel(ChannelService channelService, UUID userId, int index) {
+ ChannelResponse channel = channelService.createPublicChannel(
+ new ChannelCreateRequest(
+ "공지" + index,
+ userId,
+ "공지 채널입니다.")
+ );
+ System.out.println(
+ "채널 이름: " + channel.title()
+ + "\n채널 생성자: " + channel.userId()
+ );
+
+ return channel;
+ }
+
+ static void setupMessage(MessageService messageService, UUID channelId, UUID userId, int index) {
+ MessageResponse message = messageService.create(
+ new MessageCreateRequest(
+ channelId,
+ userId,
+ "메시지 작성" + index,
+ "안녕하세요." + index,
+ new ArrayList<>()
+ )
+ );
+ System.out.println(
+ "메시지 생성: " + message.id()
+ + "\n제목: " + message.title()
+ + "\n내용: " + message.content()
+ );
+ }
+
+ static void displayAllData(UserService userService,
+ ChannelService channelService,
+ MessageService messageService,
+ UserStatusService userStatusService,
+ ReadStatusService readStatusService) {
+ int random = new Random().nextInt(0, 5);
+ System.out.println("전체 유저: " + userService.findAll().stream().map(UserResponse::nickname).toList());
+ List channelList = channelService.findAll();
+ System.out.println("전체 채널: " + channelList.stream().map(ChannelResponse::title).toList());
+ System.out.println("채널 " + random + 1 + " 소속 메시지: " + messageService.findByChannelId(channelList.get(random).id()).stream().map(MessageResponse::title).toList());
+ System.out.println("User Status :" + userStatusService.findAll().stream()
+ .map(status -> userService.findById(status.userId()).isOnline())
+ .toList());
+ System.out.println("Read Status :" + readStatusService.finAllByUserId(
+ userService.findAll().get(random).id()).stream()
+ .map(status -> userService.findById(status.userId()))
+ .toList()
+ );
+ }
+
+ static void login(AuthService authService) {
+ int random = new Random().nextInt(1, 6);
+ LoginResponse auth = authService.login(new LoginRequest("woody" + random, "1234"));
+ System.out.println("로그인 성공 " + auth);
+
+ }
+
+ static void updateObject(UserService userService, ChannelService channelService, MessageService messageService) {
+ int random = new Random().nextInt(0, 5);
+ UserResponse user = userService.findAll().get(random);
+ UserUpdateRequest updateUser = new UserUpdateRequest(user.id(), "비밀번호가 안보여서 이름 변경", null, null);
+ userService.update(updateUser);
+ System.out.println("유저 "
+ + user.nickname()
+ + " 정보 업데이트 결과: "
+ + userService.findById(user.id())
+ );
+
+ ChannelResponse channel = channelService.findAllByUserId(user.id()).get(random);
+ ChannelUpdateRequest updateChannel = new ChannelUpdateRequest(
+ channel.id(), null, "채널 정보 업데이트");
+ channelService.update(updateChannel);
+ System.out.println("채널 "
+ + channel.title()
+ + " 정보 업데이트 결과: "
+ + channelService.findById(channel.id())
+ );
+
+ MessageResponse message = messageService.findByChannelId(channel.id()).get(0);
+ MessageUpdateRequest updateMessage = new MessageUpdateRequest(
+ message.id(), null, "메시지 내용 업데이트");
+ messageService.update(updateMessage);
+ System.out.println("채널 "
+ + message.title()
+ + " 정보 업데이트 결과: "
+ + messageService.findByChannelId(channel.id())
+ );
+ }
+
+ static void deleteData(UserService userService,
+ ChannelService channelService
+ ) {
+ int random = new Random().nextInt(0, 5);
+ UserResponse user = userService.findAll().get(random);
+ ChannelResponse channelId = channelService.findAllByUserId(user.id()).get(random);
+
+ System.out.println("유저 " + userService.findAll().get(random).nickname() + " 삭제");
+ userService.delete(user.id());
+ System.out.println(userService.findAll().stream().map(UserResponse::nickname).toList());
+ System.out.println("채널 " + channelService.findAllByUserId(user.id()).get(random).title() + " 삭제");
+ channelService.delete(channelId.id());
+ System.out.println(channelService.findAll().stream().map(ChannelResponse::title).toList());
+
+ }
+
+
+ public static void main(String[] args) {
+ ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args);
+ System.out.println("http://localhost:8080/");
+
+ System.out.println(Instant.now().toString());
+ System.out.println();
+
+ UserService userService = context.getBean(UserService.class);
+ ChannelService channelService = context.getBean(ChannelService.class);
+ MessageService messageService = context.getBean(MessageService.class);
+ AuthService authService = context.getBean(AuthService.class);
+ UserStatusService userStatusService = context.getBean(UserStatusService.class);
+ ReadStatusService readStatusService = context.getBean(ReadStatusService.class);
+
+ System.out.println("======= [1] entity 생성 =======");
+ List users = setupUser(userService);
+ int index = 1;
+ for (UserResponse user : users) {
+ ChannelResponse channel = setupPublicChannel(channelService, user.id(), index);
+ setupMessage(messageService, channel.id(), user.id(), index);
+ index++;
+ System.out.println();
+ }
+
+ System.out.println("======= [2] 서비스 작동 확인 =======");
+ displayAllData(userService, channelService, messageService, userStatusService, readStatusService);
+ login(authService);
+ System.out.println();
+
+ System.out.println("======= [3] 서비스 내용 수정 =======");
+ updateObject(userService, channelService, messageService);
+ System.out.println();
+
+ System.out.println("======= [4] 데이터 삭제 =======");
+ deleteData(userService, channelService);
+ System.out.println();
+
+ System.out.println("======= Test 종료 =======");
+
+
+ }
}
+
diff --git a/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java b/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java
deleted file mode 100644
index 9f164ab7..00000000
--- a/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.sprint.mission.discodeit.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.MediaType;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Configuration
-public class WebConfig implements WebMvcConfigurer {
-
- @Override
- public void extendMessageConverters(List> converters) {
- for (HttpMessageConverter> converter : converters) {
- if (converter instanceof MappingJackson2HttpMessageConverter jacksonConverter) {
- List supportedMediaTypes = new ArrayList<>(jacksonConverter.getSupportedMediaTypes());
-
- supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
-
- jacksonConverter.setSupportedMediaTypes(supportedMediaTypes);
- }
- }
- }
-}
-
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java
deleted file mode 100644
index 4448882f..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.AuthApi;
-import com.sprint.mission.discodeit.dto.request.LoginRequest;
-import com.sprint.mission.discodeit.entity.User;
-import com.sprint.mission.discodeit.service.AuthService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/auth")
-public class AuthController implements AuthApi {
-
- private final AuthService authService;
-
- @RequestMapping(path = "/login",method = RequestMethod.POST)
- public ResponseEntity login(@RequestBody LoginRequest loginRequest) {
- User user = authService.login(loginRequest);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(user);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java
deleted file mode 100644
index 243cbb45..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.BinaryContentApi;
-import com.sprint.mission.discodeit.entity.BinaryContent;
-import com.sprint.mission.discodeit.service.BinaryContentService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/binaryContents")
-public class BinaryContentController implements BinaryContentApi {
-
- private final BinaryContentService binaryContentService;
-
- @RequestMapping(path = "/{binaryContentId}",
- method = RequestMethod.GET)
- public ResponseEntity find(@PathVariable UUID binaryContentId) {
- BinaryContent binaryContent = binaryContentService.find(binaryContentId);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(binaryContent);
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public ResponseEntity> findAllByIdIn(
- @RequestParam("binaryContentIds") List binaryContentIds) {
- List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(binaryContents);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java
deleted file mode 100644
index 4d70d675..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.ChannelApi;
-import com.sprint.mission.discodeit.dto.data.ChannelDto;
-import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest;
-import com.sprint.mission.discodeit.entity.Channel;
-import com.sprint.mission.discodeit.service.ChannelService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/channels")
-public class ChannelController implements ChannelApi {
-
- private final ChannelService channelService;
-
- @RequestMapping(path = "/public", method = RequestMethod.POST)
- public ResponseEntity create(@RequestBody PublicChannelCreateRequest request) {
- Channel createdChannel = channelService.create(request);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(createdChannel);
- }
-
- @RequestMapping(path = "/private", method = RequestMethod.POST)
- public ResponseEntity create(@RequestBody PrivateChannelCreateRequest request) {
- Channel createdChannel = channelService.create(request);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(createdChannel);
- }
-
- @RequestMapping(path = "/{channelId}", method = RequestMethod.PATCH)
- public ResponseEntity update(@PathVariable UUID channelId,
- @RequestBody PublicChannelUpdateRequest request) {
- Channel udpatedChannel = channelService.update(channelId, request);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(udpatedChannel);
- }
-
- @RequestMapping(path = "/{channelId}", method = RequestMethod.DELETE)
- public ResponseEntity delete(@PathVariable UUID channelId) {
- channelService.delete(channelId);
- return ResponseEntity
- .status(HttpStatus.NO_CONTENT)
- .build();
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public ResponseEntity> findAll(@RequestParam("userId") UUID userId) {
- List channels = channelService.findAllByUserId(userId);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(channels);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java
deleted file mode 100644
index 95686cb8..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.MessageApi;
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest;
-import com.sprint.mission.discodeit.entity.Message;
-import com.sprint.mission.discodeit.service.MessageService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/messages")
-public class MessageController implements MessageApi {
-
- private final MessageService messageService;
-
- @RequestMapping(
- method = RequestMethod.POST,
- consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}
- )
- public ResponseEntity create(
- @RequestPart("messageCreateRequest") MessageCreateRequest messageCreateRequest,
- @RequestPart(value = "attachments", required = false) List attachments
- ) {
- List attachmentRequests = Optional.ofNullable(attachments)
- .map(files -> files.stream()
- .map(file -> {
- try {
- return new BinaryContentCreateRequest(
- file.getOriginalFilename(),
- file.getContentType(),
- file.getBytes()
- );
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- })
- .toList())
- .orElse(new ArrayList<>());
- Message createdMessage = messageService.create(messageCreateRequest, attachmentRequests);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(createdMessage);
- }
-
- @RequestMapping(path = "/{messageId}", method = RequestMethod.PATCH)
- public ResponseEntity update(@PathVariable UUID messageId,
- @RequestBody MessageUpdateRequest request) {
- Message updatedMessage = messageService.update(messageId, request);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(updatedMessage);
- }
-
- @RequestMapping(path = "/{messageId}",method = RequestMethod.DELETE)
- public ResponseEntity delete(@PathVariable UUID messageId) {
- messageService.delete(messageId);
- return ResponseEntity
- .status(HttpStatus.NO_CONTENT)
- .build();
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public ResponseEntity> findAllByChannelId(
- @RequestParam("channelId") UUID channelId) {
- List messages = messageService.findAllByChannelId(channelId);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(messages);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java
deleted file mode 100644
index 30140b63..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.ReadStatusApi;
-import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest;
-import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest;
-import com.sprint.mission.discodeit.entity.ReadStatus;
-import com.sprint.mission.discodeit.service.ReadStatusService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/readStatuses")
-public class ReadStatusController implements ReadStatusApi {
-
- private final ReadStatusService readStatusService;
-
- @RequestMapping(method = RequestMethod.POST)
- public ResponseEntity create(@RequestBody ReadStatusCreateRequest request) {
- ReadStatus createdReadStatus = readStatusService.create(request);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(createdReadStatus);
- }
-
- @RequestMapping(path = "/{readStatusId}",
- method = RequestMethod.PATCH)
- public ResponseEntity update(@PathVariable UUID readStatusId,
- @RequestBody ReadStatusUpdateRequest request) {
- ReadStatus updatedReadStatus = readStatusService.update(readStatusId, request);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(updatedReadStatus);
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public ResponseEntity> findAllByUserId(@RequestParam("userId") UUID userId) {
- List readStatuses = readStatusService.findAllByUserId(userId);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(readStatuses);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java
deleted file mode 100644
index 56f67a6b..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.sprint.mission.discodeit.controller;
-
-import com.sprint.mission.discodeit.controller.api.UserApi;
-import com.sprint.mission.discodeit.dto.data.UserDto;
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest;
-import com.sprint.mission.discodeit.dto.request.UserUpdateRequest;
-import com.sprint.mission.discodeit.entity.User;
-import com.sprint.mission.discodeit.entity.UserStatus;
-import com.sprint.mission.discodeit.service.UserService;
-import com.sprint.mission.discodeit.service.UserStatusService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/users")
-public class UserController implements UserApi {
-
- private final UserService userService;
- private final UserStatusService userStatusService;
-
- @RequestMapping(
- consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
- method = RequestMethod.POST
- )
- public ResponseEntity create(
- @RequestPart("userCreateRequest") UserCreateRequest userCreateRequest,
- @RequestPart(value = "profile", required = false) MultipartFile profile
- ) {
- Optional profileRequest = Optional.ofNullable(profile)
- .flatMap(this::resolveProfileRequest);
- User createdUser = userService.create(userCreateRequest, profileRequest);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(createdUser);
- }
-
- @RequestMapping(
- path = "/{userId}",
- consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
- method = RequestMethod.PATCH
- )
- public ResponseEntity update(
- @PathVariable UUID userId,
- @RequestPart("userUpdateRequest") UserUpdateRequest userUpdateRequest,
- @RequestPart(value = "profile", required = false) MultipartFile profile
- ) {
- Optional profileRequest = Optional.ofNullable(profile)
- .flatMap(this::resolveProfileRequest);
- User updatedUser = userService.update(userId, userUpdateRequest, profileRequest);
- return ResponseEntity
- .status(HttpStatus.CREATED)
- .body(updatedUser);
- }
-
- @RequestMapping(path = "/{userId}", method = RequestMethod.DELETE)
- public ResponseEntity delete(@PathVariable UUID userId) {
- userService.delete(userId);
- return ResponseEntity
- .status(HttpStatus.NO_CONTENT)
- .build();
- }
-
- @RequestMapping(method = RequestMethod.GET)
- public ResponseEntity> findAll() {
- List users = userService.findAll();
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(users);
- }
-
- @RequestMapping(path = "/{userId}/userStatus",
- method = RequestMethod.PATCH)
- public ResponseEntity updateUserStatusByUserId(
- @PathVariable UUID userId,
- @RequestBody UserStatusUpdateRequest request
- ) {
- UserStatus updatedUserStatus = userStatusService.updateByUserId(userId, request);
- return ResponseEntity
- .status(HttpStatus.OK)
- .body(updatedUserStatus);
- }
-
- private Optional resolveProfileRequest(MultipartFile profileFile) {
- if (profileFile.isEmpty()) {
- return Optional.empty();
- } else {
- try {
- BinaryContentCreateRequest binaryContentCreateRequest = new BinaryContentCreateRequest(
- profileFile.getOriginalFilename(),
- profileFile.getContentType(),
- profileFile.getBytes()
- );
- return Optional.of(binaryContentCreateRequest);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java
deleted file mode 100644
index c74aab15..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.dto.request.LoginRequest;
-import com.sprint.mission.discodeit.entity.User;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-
-@Tag(name = "Auth", description = "인증 관련 API")
-public interface AuthApi {
-
- @Operation(summary = "로그인")
- @ApiResponses({
- @ApiResponse(responseCode = "200", description = "로그인 성공"),
- @ApiResponse(responseCode = "400", description = "비밀번호가 일치하지 않음"),
- @ApiResponse(responseCode = "404", description = "사용자를 찾을 수 없음")
- })
- ResponseEntity login(@Parameter(description = "로그인 정보") LoginRequest loginRequest);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java
deleted file mode 100644
index caacb3e0..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.entity.BinaryContent;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-
-import java.util.List;
-import java.util.UUID;
-
-@Tag(name = "BinaryContent", description = "첨부 파일 관리 API")
-public interface BinaryContentApi {
-
- @Operation(summary = "첨부 파일 조회")
- @ApiResponse(responseCode = "200", description = "첨부 파일 조회 성공")
- ResponseEntity find(@Parameter(description = "조회할 첨부 파일 ID") UUID binaryContentId);
-
- @Operation(summary = "여러 첨부 파일 조회")
- @ApiResponse(responseCode = "200", description = "첨부 파일 목록 조회 성공")
- ResponseEntity> findAllByIdIn(@Parameter(description = "조회할 첨부 파일 ID 목록") List binaryContentIds);
-
-
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java
deleted file mode 100644
index 33f04fad..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.dto.data.ChannelDto;
-import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest;
-import com.sprint.mission.discodeit.entity.Channel;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-
-import java.util.List;
-import java.util.UUID;
-
-@Tag(name = "Channel", description = "채널 관리 API")
-public interface ChannelApi {
-
- @Operation(summary = "Public Channel 생성")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "Public Channel 생성 성공"),
- @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터")
- })
- ResponseEntity create(@Parameter(description = "Public Channel 생성 정보") PublicChannelCreateRequest request);
-
- @Operation(summary = "Private Channel 생성")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "Private Channel 생성 성공"),
- @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터")
- })
- ResponseEntity create(@Parameter(description = "Private Channel 생성 정보") PrivateChannelCreateRequest request);
-
- @Operation(summary = "Channel 정보 수정")
- @ApiResponses({
- @ApiResponse(responseCode = "200", description = "Channel 정보가 성공적으로 수정됨"),
- @ApiResponse(responseCode = "400", description = "수정 정보 오류"),
- @ApiResponse(responseCode = "404", description = "채널을 찾을 수 없음")
- })
- ResponseEntity update(
- @Parameter(description = "수정할 Channel ID") UUID channelId,
- @Parameter(description = "수정할 Channel 정보") PublicChannelUpdateRequest request
- );
-
- @Operation(summary = "Channel 삭제")
- @ApiResponses({
- @ApiResponse(responseCode = "204", description = "Channel 삭제 성공"),
- @ApiResponse(responseCode = "404", description = "삭제할 채널이 존재하지 않음")
- })
- ResponseEntity delete(@Parameter(description = "삭제할 Channel ID") UUID channelId);
-
- @Operation(summary = "User가 참여 중인 Channel 목록 조회")
- @ApiResponse(responseCode = "200", description = "Channel 목록 조회 성공")
- ResponseEntity> findAll(@Parameter(description = "조회할 User ID") UUID userId);
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java
deleted file mode 100644
index 7ae45a3a..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.dto.request.MessageCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest;
-import com.sprint.mission.discodeit.entity.Message;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-import java.util.UUID;
-
-@Tag(name = "Message", description = "메시지 관리 API")
-public interface MessageApi {
-
- @Operation(summary = "Message 생성")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "Message 생성 성공"),
- @ApiResponse(responseCode = "404", description = "채널을 찾을 수 없음")
- })
- ResponseEntity create(
- @Parameter(description = "Message 생성 정보") MessageCreateRequest request,
- @Parameter(description = "Message 첨부 파일들") List attachments
- );
-
- @Operation(summary = "Message 내용 수정")
- @ApiResponses({
- @ApiResponse(responseCode = "200", description = "Message가 성공적으로 수정됨"),
- @ApiResponse(responseCode = "404", description = "메시지를 찾을 수 없음")
- })
- ResponseEntity update(
- @Parameter(description = "수정할 Message ID") UUID messageId,
- @Parameter(description = "수정할 Message 내용") MessageUpdateRequest request
- );
-
- @Operation(summary = "Message 삭제")
- @ApiResponses({
- @ApiResponse(responseCode = "204", description = "Message 삭제 성공"),
- @ApiResponse(responseCode = "404", description = "삭제할 메시지가 존재하지 않음")
- })
- ResponseEntity delete(@Parameter(description = "삭제할 Message ID") UUID messageId);
-
- @Operation(summary = "Channel의 Message 목록 조회")
- @ApiResponse(responseCode = "200", description = "Message 목록 조회 성공")
- ResponseEntity> findAllByChannelId(@Parameter(description = "조회할 Channel ID") UUID channelId);
-}
\ No newline at end of file
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java
deleted file mode 100644
index c7f6f3de..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest;
-import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest;
-import com.sprint.mission.discodeit.entity.ReadStatus;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-
-import java.util.List;
-import java.util.UUID;
-
-@Tag(name = "ReadStatus", description = "읽음 상태 관리 API")
-public interface ReadStatusApi {
-
- @Operation(summary = "Message 읽음 상태 생성")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "생성 성공"),
- @ApiResponse(responseCode = "400", description = "잘못된 요청"),
- @ApiResponse(responseCode = "404", description = "데이터 없음")
- })
- ResponseEntity create(@Parameter(description = "Message 읽음 상태 생성 정보") ReadStatusCreateRequest request);
-
- @Operation(summary = "Message 읽음 상태 수정")
- ResponseEntity update(@Parameter(description = "수정할 읽음 상태 ID") UUID readStatusId,
- @Parameter(description = "수정할 읽음 상태 정보") ReadStatusUpdateRequest request);
-
- @Operation(summary = "User의 Message 읽음 상태 목록 조회")
- ResponseEntity> findAllByUserId(@Parameter(description = "조회할 User ID") UUID userId);
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java
deleted file mode 100644
index 1efcc9b2..00000000
--- a/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.sprint.mission.discodeit.controller.api;
-
-import com.sprint.mission.discodeit.dto.data.UserDto;
-import com.sprint.mission.discodeit.dto.request.UserCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest;
-import com.sprint.mission.discodeit.dto.request.UserUpdateRequest;
-import com.sprint.mission.discodeit.entity.User;
-import com.sprint.mission.discodeit.entity.UserStatus;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-import java.util.UUID;
-
-@Tag(name = "User", description = "User 관리 API")
-public interface UserApi {
-
- @Operation(summary = "User 등록", description = "새로운 유저를 등록합니다.")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "User 등록 성공"),
- @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터")
- })
- ResponseEntity create(
- @Parameter(description = "User 생성 정보") UserCreateRequest request,
- @Parameter(description = "User 프로필 이미지") MultipartFile profile
- );
-
- @Operation(summary = "User 정보 수정", description = "기존 유저의 정보를 수정합니다.")
- @ApiResponses({
- @ApiResponse(responseCode = "201", description = "User 정보가 성공적으로 수정됨"),
- @ApiResponse(responseCode = "400", description = "수정 요청 파라미터 오류"),
- @ApiResponse(responseCode = "404", description = "해당 ID의 유저를 찾을 수 없음")
- })
- ResponseEntity update(
- @Parameter(description = "수정할 User ID") UUID userId,
- @Parameter(description = "수정할 User 정보") UserUpdateRequest userUpdateRequest,
- @Parameter(description = "수정할 User 프로필 이미지") MultipartFile profile
- );
-
- @Operation(summary = "User 삭제", description = "특정 유저를 삭제합니다.")
- @ApiResponses({
- @ApiResponse(responseCode = "204", description = "User 삭제 성공"),
- @ApiResponse(responseCode = "404", description = "삭제할 유저가 존재하지 않음")
- })
- ResponseEntity delete(@Parameter(description = "삭제할 User ID") UUID userId);
-
- @Operation(summary = "전체 User 목록 조회", description = "시스템에 등록된 모든 유저를 조회합니다.")
- @ApiResponse(responseCode = "200", description = "User 목록 조회 성공")
- ResponseEntity> findAll();
-
- @Operation(summary = "User 온라인 상태 업데이트", description = "유저의 접속 상태를 변경합니다.")
- @ApiResponses({
- @ApiResponse(responseCode = "200", description = "User 온라인 상태가 성공적으로 업데이트됨"),
- @ApiResponse(responseCode = "404", description = "유저를 찾을 수 없음")
- })
- ResponseEntity updateUserStatusByUserId(
- @Parameter(description = "상태를 변경할 User ID") UUID userId,
- @RequestBody UserStatusUpdateRequest request
- );
-}
\ No newline at end of file
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginRequest.java
new file mode 100644
index 00000000..f9e02fc7
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginRequest.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto.auth;
+
+public record LoginRequest(
+ String name,
+ String password
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginResponse.java
new file mode 100644
index 00000000..f8ca0661
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/auth/LoginResponse.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto.auth;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public record LoginResponse(
+ UUID id,
+ Instant loginTime
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentRequest.java
new file mode 100644
index 00000000..0e34450b
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentRequest.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto.binarycontent;
+
+public record BinaryContentRequest(
+ String fileName,
+ String url
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentResponse.java
new file mode 100644
index 00000000..f7883216
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentResponse.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto.binarycontent;
+
+import java.util.UUID;
+
+public record BinaryContentResponse(
+ UUID id,
+ String fileName,
+ String url
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelCreateRequest.java
new file mode 100644
index 00000000..101dd172
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelCreateRequest.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto.channel;
+
+import java.util.UUID;
+
+public record ChannelCreateRequest(
+ String title,
+ UUID userId,
+ String description
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelResponse.java
new file mode 100644
index 00000000..0e9b2dec
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelResponse.java
@@ -0,0 +1,18 @@
+package com.sprint.mission.discodeit.dto.channel;
+
+import com.sprint.mission.discodeit.entity.ChannelType;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.UUID;
+
+public record ChannelResponse(
+ UUID id,
+ UUID userId,
+ String title,
+ String description,
+ ChannelType type,
+ Instant updatedAt,
+ List memberIds
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelUpdateRequest.java
new file mode 100644
index 00000000..9e519aff
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelUpdateRequest.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto.channel;
+
+import java.util.UUID;
+
+public record ChannelUpdateRequest(
+ UUID id,
+ String title,
+ String description
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java
new file mode 100644
index 00000000..be92ab0c
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java
@@ -0,0 +1,11 @@
+package com.sprint.mission.discodeit.dto.channel;
+
+import java.util.List;
+import java.util.UUID;
+
+public record PrivateChannelCreateRequest(
+ List memberIds,
+ UUID userId
+) {
+
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java
deleted file mode 100644
index 21c5d760..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.sprint.mission.discodeit.dto.data;
-
-import com.sprint.mission.discodeit.entity.ChannelType;
-
-import java.time.Instant;
-import java.util.List;
-import java.util.UUID;
-
-public record ChannelDto(
- UUID id,
- ChannelType type,
- String name,
- String description,
- List participantIds,
- Instant lastMessageAt
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java
deleted file mode 100644
index d7911dea..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.sprint.mission.discodeit.dto.data;
-
-import java.time.Instant;
-import java.util.UUID;
-
-public record UserDto(
- UUID id,
- Instant createdAt,
- Instant updatedAt,
- String username,
- String email,
- UUID profileId,
- Boolean online
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageCreateRequest.java
new file mode 100644
index 00000000..e703ed7d
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageCreateRequest.java
@@ -0,0 +1,13 @@
+package com.sprint.mission.discodeit.dto.message;
+
+import java.util.List;
+import java.util.UUID;
+
+public record MessageCreateRequest(
+ UUID channelId,
+ UUID userId,
+ String title,
+ String content,
+ List attachmentIds
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageResponse.java
new file mode 100644
index 00000000..59ab07ac
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageResponse.java
@@ -0,0 +1,14 @@
+package com.sprint.mission.discodeit.dto.message;
+
+import java.util.List;
+import java.util.UUID;
+
+public record MessageResponse(
+ UUID id,
+ UUID channelId,
+ UUID userId,
+ String title,
+ String content,
+ List attachmentIds
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageUpdateRequest.java
new file mode 100644
index 00000000..a90bddc5
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageUpdateRequest.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto.message;
+
+import java.util.UUID;
+
+public record MessageUpdateRequest(
+ UUID id,
+ String title,
+ String content
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java
deleted file mode 100644
index d86eb989..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record BinaryContentCreateRequest(
- String fileName,
- String contentType,
- byte[] bytes
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java
deleted file mode 100644
index 51ca9e62..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record LoginRequest(
- String username,
- String password
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java
deleted file mode 100644
index 0f65742b..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.util.UUID;
-
-public record MessageCreateRequest(
- String content,
- UUID channelId,
- UUID authorId
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java
deleted file mode 100644
index d786b1e8..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record MessageUpdateRequest(
- String newContent
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java
deleted file mode 100644
index 7edd4e82..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.util.List;
-import java.util.UUID;
-
-public record PrivateChannelCreateRequest(
- List participantIds
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java
deleted file mode 100644
index 48e26327..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record PublicChannelCreateRequest(
- String name,
- String description
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java
deleted file mode 100644
index d6e51541..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record PublicChannelUpdateRequest(
- String newName,
- String newDescription
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java
deleted file mode 100644
index 046a4880..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.time.Instant;
-import java.util.UUID;
-
-public record ReadStatusCreateRequest(
- UUID userId,
- UUID channelId,
- Instant lastReadAt
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java
deleted file mode 100644
index 16b0c27c..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.time.Instant;
-
-public record ReadStatusUpdateRequest(
- Instant newLastReadAt
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java
deleted file mode 100644
index e10e0ec5..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record UserCreateRequest(
- String username,
- String email,
- String password
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java
deleted file mode 100644
index 71c92abb..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.time.Instant;
-import java.util.UUID;
-
-public record UserStatusCreateRequest(
- UUID userId,
- Instant lastActiveAt
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java
deleted file mode 100644
index c69b2610..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-import java.time.Instant;
-
-public record UserStatusUpdateRequest(
- Instant newLastActiveAt
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java
deleted file mode 100644
index 1e14e2cb..00000000
--- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto.request;
-
-public record UserUpdateRequest(
- String newUsername,
- String newEmail,
- String newPassword
-) {
-
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusResponse.java
new file mode 100644
index 00000000..38c55ac7
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusResponse.java
@@ -0,0 +1,13 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public record ReadStatusResponse(
+ UUID id,
+ UUID userId,
+ UUID channelId,
+ Instant createdAt,
+ Instant updatedAt
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusUpdateRequest.java
new file mode 100644
index 00000000..9695b10b
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatusUpdateRequest.java
@@ -0,0 +1,8 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.util.UUID;
+
+public record ReadStatusUpdateRequest(
+ UUID id
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatuscreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatuscreateRequest.java
new file mode 100644
index 00000000..b1ddab00
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/ReadStatuscreateRequest.java
@@ -0,0 +1,9 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.util.UUID;
+
+public record ReadStatuscreateRequest(
+ UUID userId,
+ UUID channelId
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusCreateRequest.java
new file mode 100644
index 00000000..0b304216
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusCreateRequest.java
@@ -0,0 +1,8 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.util.UUID;
+
+public record UserStatusCreateRequest(
+ UUID userId
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusResponse.java
new file mode 100644
index 00000000..5d08d2aa
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusResponse.java
@@ -0,0 +1,9 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.util.UUID;
+
+public record UserStatusResponse(
+ UUID id,
+ UUID userId
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusUpdateRequest.java
new file mode 100644
index 00000000..d04109d5
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/status/UserStatusUpdateRequest.java
@@ -0,0 +1,8 @@
+package com.sprint.mission.discodeit.dto.status;
+
+import java.util.UUID;
+
+public record UserStatusUpdateRequest(
+ UUID id
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java
new file mode 100644
index 00000000..a7466ff1
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java
@@ -0,0 +1,11 @@
+package com.sprint.mission.discodeit.dto.user;
+
+public record UserCreateRequest(
+ String name,
+ String email,
+ String nickname,
+ String password,
+ String profileFileName,
+ String profileUrl
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserResponse.java
new file mode 100644
index 00000000..67ddf084
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserResponse.java
@@ -0,0 +1,13 @@
+package com.sprint.mission.discodeit.dto.user;
+
+import java.util.UUID;
+
+public record UserResponse(
+ UUID id,
+ String name,
+ String email,
+ String nickname,
+ UUID profileId,
+ boolean isOnline
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserUpdateRequest.java
new file mode 100644
index 00000000..048c4efb
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserUpdateRequest.java
@@ -0,0 +1,11 @@
+package com.sprint.mission.discodeit.dto.user;
+
+import java.util.UUID;
+
+public record UserUpdateRequest(
+ UUID id,
+ String name,
+ UUID profileId,
+ String password
+) {
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
index 12948a60..7a37383b 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
@@ -2,29 +2,27 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import java.util.UUID;
@Getter
public class BinaryContent implements Serializable {
+ private final UUID id;
+ private final String fileName;
+ private final String url;
+ private final Instant createdAt;
- private static final long serialVersionUID = 1L;
- private UUID id;
- private Instant createdAt;
- //
- private String fileName;
- private Long size;
- private String contentType;
- private byte[] bytes;
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public BinaryContent( String fileName, String url) {
+ this.id = UUID.randomUUID();
+ this.fileName = fileName;
+ this.url = url;
+ this.createdAt = Instant.now();
+ }
- public BinaryContent(String fileName, Long size, String contentType, byte[] bytes) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.fileName = fileName;
- this.size = size;
- this.contentType = contentType;
- this.bytes = bytes;
- }
}
+
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java
index ae49b796..88636ed2 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java
@@ -2,44 +2,60 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import java.util.UUID;
@Getter
public class Channel implements Serializable {
+ private final UUID id;
+ private final UUID userId;
+ private String title;
+ private String description;
+ private final ChannelType type;
+ private final Instant createdAt;
+ private Instant updatedAt;
- private static final long serialVersionUID = 1L;
- private UUID id;
- private Instant createdAt;
- private Instant updatedAt;
- //
- private ChannelType type;
- private String name;
- private String description;
-
- public Channel(ChannelType type, String name, String description) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.type = type;
- this.name = name;
- this.description = description;
- }
-
- public void update(String newName, String newDescription) {
- boolean anyValueUpdated = false;
- if (newName != null && !newName.equals(this.name)) {
- this.name = newName;
- anyValueUpdated = true;
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public Channel(ChannelType type, String title, UUID userId, String description) {
+ id = UUID.randomUUID();
+ this.title = title;
+ this.userId = userId;
+ this.description = description;
+ this.type = type;
+ createdAt = Instant.now();
+ updatedAt = Instant.now();
}
- if (newDescription != null && !newDescription.equals(this.description)) {
- this.description = newDescription;
- anyValueUpdated = true;
+
+ public void update(String title, String description){
+ boolean isUpdated = false;
+
+ if(title != null){
+ this.title = title;
+ isUpdated = true;
+ }
+ if(description != null){
+ this.description = description;
+ isUpdated = true;
+ }
+
+ if(isUpdated){
+ this.updatedAt = Instant.now();
+ }
}
- if (anyValueUpdated) {
- this.updatedAt = Instant.now();
+ @Override
+ public String toString() {
+ return "Channel{" +
+ "id=" + id +
+ ", user=" + userId +
+ ", title='" + title + '\'' +
+ ", category='" + description + '\'' +
+ ", createdAt=" + createdAt +
+ ", updatedAt=" + updatedAt +
+ '}'+"\n";
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java
index 4fca3772..9a2ff3f0 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java
@@ -1,6 +1,6 @@
package com.sprint.mission.discodeit.entity;
public enum ChannelType {
- PUBLIC,
- PRIVATE,
+ PUBLIC,
+ PRIVATE,
}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java
index 14ac8247..eccd41f9 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java
@@ -2,45 +2,69 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
+import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Getter
public class Message implements Serializable {
+ private final UUID id;
+ private final UUID channelId;
+ private final UUID userId;
+ private String title;
+ private String content;
+ private final Instant createdAt;
+ private Instant updatedAt;
+ private final List attachmentIds;
- private static final long serialVersionUID = 1L;
-
- private UUID id;
- private Instant createdAt;
- private Instant updatedAt;
- //
- private String content;
- //
- private UUID channelId;
- private UUID authorId;
- private List attachmentIds;
-
- public Message(String content, UUID channelId, UUID authorId, List attachmentIds) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.content = content;
- this.channelId = channelId;
- this.authorId = authorId;
- this.attachmentIds = attachmentIds;
- }
-
- public void update(String newContent) {
- boolean anyValueUpdated = false;
- if (newContent != null && !newContent.equals(this.content)) {
- this.content = newContent;
- anyValueUpdated = true;
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public Message(UUID channelId, UUID userId, String title, String content, List attachmentIds) {
+ id = UUID.randomUUID();
+ this.channelId = channelId;
+ this.userId = userId;
+ this.title = title;
+ this.content = content;
+ this.attachmentIds = attachmentIds == null ? new ArrayList<>() : attachmentIds;
+ createdAt = Instant.now();
+ updatedAt = Instant.now();
+ }
+
+ public void addContents(BinaryContent binaryContent){
+ attachmentIds.add(binaryContent.getId());
+ }
+
+ public void update(String title, String content){
+ boolean isUpdated = false;
+
+ if(title != null){
+ this.title = title;
+ isUpdated = true;
+ }
+ if(content != null){
+ this.content = content;
+ isUpdated = true;
+ }
+
+ if(isUpdated){
+ this.updatedAt = Instant.now();
+ }
}
- if (anyValueUpdated) {
- this.updatedAt = Instant.now();
+ @Override
+ public String toString() {
+ return "Message{" +
+ "id=" + id +
+ ", channel=" + channelId +
+ ", user=" + userId +
+ ", title='" + title + '\'' +
+ ", content='" + content + '\'' +
+ ", createdAt=" + createdAt +
+ ", updatedAt=" + updatedAt +
+ '}'+"\n";
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
index 13ba1ef6..967ca0b7 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
@@ -2,40 +2,31 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import java.util.UUID;
@Getter
-public class ReadStatus implements Serializable {
+public class ReadStatus implements Serializable { // 메시지를 읽었는지 여부
+ private final UUID id;
+ private final UUID userId;
+ private final UUID channelId;
+ private final Instant createdAt;
+ private Instant updatedAt;
- private static final long serialVersionUID = 1L;
- private UUID id;
- private Instant createdAt;
- private Instant updatedAt;
- //
- private UUID userId;
- private UUID channelId;
- private Instant lastReadAt;
+ @Serial
+ private static final long serialVersionUID = 1L;
- public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.userId = userId;
- this.channelId = channelId;
- this.lastReadAt = lastReadAt;
- }
-
- public void update(Instant newLastReadAt) {
- boolean anyValueUpdated = false;
- if (newLastReadAt != null && !newLastReadAt.equals(this.lastReadAt)) {
- this.lastReadAt = newLastReadAt;
- anyValueUpdated = true;
+ public ReadStatus(UUID userId, UUID channelId) {
+ this.id = UUID.randomUUID();
+ this.userId = userId;
+ this.channelId = channelId;
+ this.createdAt = Instant.now();
+ this.updatedAt = Instant.now();
}
- if (anyValueUpdated) {
- this.updatedAt = Instant.now();
+ public void updateReadTime(){
+ this.updatedAt = Instant.now();
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java
index 60466729..8e7c0301 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/User.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java
@@ -2,55 +2,70 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import java.util.UUID;
@Getter
public class User implements Serializable {
+ private final UUID id;
+ private UUID profileId;
+ private String name;
+ private final String email;
+ private final String nickname;
+ private String password;
+ private final Instant createdAt;
+ private Instant updatedAt;
- private static final long serialVersionUID = 1L;
-
- private UUID id;
- private Instant createdAt;
- private Instant updatedAt;
- //
- private String username;
- private String email;
- private String password;
- private UUID profileId; // BinaryContent
-
- public User(String username, String email, String password, UUID profileId) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.username = username;
- this.email = email;
- this.password = password;
- this.profileId = profileId;
- }
-
- public void update(String newUsername, String newEmail, String newPassword, UUID newProfileId) {
- boolean anyValueUpdated = false;
- if (newUsername != null && !newUsername.equals(this.username)) {
- this.username = newUsername;
- anyValueUpdated = true;
- }
- if (newEmail != null && !newEmail.equals(this.email)) {
- this.email = newEmail;
- anyValueUpdated = true;
- }
- if (newPassword != null && !newPassword.equals(this.password)) {
- this.password = newPassword;
- anyValueUpdated = true;
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public User(BinaryContent profile, String name, String email, String nickname, String password) {
+ this.id = UUID.randomUUID();
+ this.profileId = (profile != null ? profile.getId(): null);
+ this.name = name;
+ this.email = email;
+ this.nickname = nickname;
+ this.password = password;
+ createdAt = Instant.now();
+ updatedAt = Instant.now();
}
- if (newProfileId != null && !newProfileId.equals(this.profileId)) {
- this.profileId = newProfileId;
- anyValueUpdated = true;
+
+ public void update(String name,
+ UUID profileId,
+ String password ){
+ boolean isUpdated = false;
+
+ if(profileId != null){
+ this.profileId = profileId;
+ isUpdated = true;
+ }
+
+ if(name != null){
+ this.name = name;
+ isUpdated = true;
+ }
+
+ if(password != null){
+ this.password = password;
+ isUpdated = true;
+ }
+
+ if(isUpdated){
+ this.updatedAt = Instant.now();
+ }
}
- if (anyValueUpdated) {
- this.updatedAt = Instant.now();
+ @Override
+ public String toString() {
+ return "User{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", email='" + email + '\'' +
+ ", nickname='" + nickname + '\'' +
+ ", createdAt=" + createdAt +
+ ", updatedAt=" + updatedAt +
+ '}'+"\n";
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
index b9142c53..2e93b15e 100644
--- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
+++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
@@ -2,45 +2,35 @@
import lombok.Getter;
+import java.io.Serial;
import java.io.Serializable;
-import java.time.Duration;
import java.time.Instant;
+import java.time.temporal.ChronoUnit;
import java.util.UUID;
@Getter
public class UserStatus implements Serializable {
-
- private static final long serialVersionUID = 1L;
- private UUID id;
- private Instant createdAt;
- private Instant updatedAt;
- //
- private UUID userId;
- private Instant lastActiveAt;
-
- public UserStatus(UUID userId, Instant lastActiveAt) {
- this.id = UUID.randomUUID();
- this.createdAt = Instant.now();
- //
- this.userId = userId;
- this.lastActiveAt = lastActiveAt;
- }
-
- public void update(Instant lastActiveAt) {
- boolean anyValueUpdated = false;
- if (lastActiveAt != null && !lastActiveAt.equals(this.lastActiveAt)) {
- this.lastActiveAt = lastActiveAt;
- anyValueUpdated = true;
+ private final UUID id;
+ private final UUID userId;
+ private final Instant createdAt;
+ private Instant updatedAt;
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ public UserStatus(UUID userId) {
+ this.id = UUID.randomUUID();
+ this.userId = userId;
+ this.createdAt = Instant.now();
+ this.updatedAt = Instant.now();
}
- if (anyValueUpdated) {
- this.updatedAt = Instant.now();
+ public void updateActiveTime() {
+ this.updatedAt = Instant.now();
}
- }
- public Boolean isOnline() {
- Instant instantFiveMinutesAgo = Instant.now().minus(Duration.ofMinutes(5));
+ public boolean isOnline() {
+ return updatedAt.isAfter(Instant.now().minus(5, ChronoUnit.MINUTES));
+ }
- return lastActiveAt.isAfter(instantFiveMinutesAgo);
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java
deleted file mode 100644
index 9fd41787..00000000
--- a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.sprint.mission.discodeit.exception;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import java.util.NoSuchElementException;
-
-@ControllerAdvice
-@ResponseBody
-public class GlobalExceptionHandler {
-
- @ExceptionHandler(IllegalArgumentException.class)
- public ResponseEntity handleException(IllegalArgumentException e) {
- return ResponseEntity
- .status(HttpStatus.BAD_REQUEST)
- .body(e.getMessage());
- }
-
- @ExceptionHandler(NoSuchElementException.class)
- public ResponseEntity handleException(NoSuchElementException e) {
- return ResponseEntity
- .status(HttpStatus.NOT_FOUND)
- .body(e.getMessage());
- }
-
- @ExceptionHandler(Exception.class)
- public ResponseEntity handleException(Exception e) {
- return ResponseEntity
- .status(HttpStatus.INTERNAL_SERVER_ERROR)
- .body(e.getMessage());
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
index a2599841..09f93d7a 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
@@ -7,14 +7,11 @@
import java.util.UUID;
public interface BinaryContentRepository {
+ BinaryContent save(BinaryContent content);
- BinaryContent save(BinaryContent binaryContent);
+ List findAllByIdIn(List ids);
- Optional findById(UUID id);
+ Optional findById(UUID id);
- List findAllByIdIn(List ids);
-
- boolean existsById(UUID id);
-
- void deleteById(UUID id);
+ void deleteById(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java
index 93ef97cd..548c06b4 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java
@@ -2,19 +2,19 @@
import com.sprint.mission.discodeit.entity.Channel;
+import javax.swing.text.html.Option;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
public interface ChannelRepository {
+ Channel save(Channel channel);
- Channel save(Channel channel);
+ Optional findById(UUID id);
- Optional findById(UUID id);
+ List findAll();
- List findAll();
+ void delete(UUID id);
- boolean existsById(UUID id);
-
- void deleteById(UUID id);
+ boolean existsById(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
index 95421b61..7de8d5fb 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
@@ -7,16 +7,15 @@
import java.util.UUID;
public interface MessageRepository {
+ Message save(Message message);
- Message save(Message message);
+ Optional findById(UUID id);
- Optional findById(UUID id);
+ List findAll();
- List findAllByChannelId(UUID channelId);
+ List findByChannelId(UUID id);
- boolean existsById(UUID id);
+ boolean existsById (UUID id);
- void deleteById(UUID id);
-
- void deleteAllByChannelId(UUID channelId);
+ void delete(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
index 00f68a1f..6263ab16 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
@@ -7,18 +7,17 @@
import java.util.UUID;
public interface ReadStatusRepository {
+ ReadStatus save(ReadStatus readStatus);
- ReadStatus save(ReadStatus readStatus);
+ List findAll();
- Optional findById(UUID id);
+ Optional findById(UUID id);
- List findAllByUserId(UUID userId);
+ List findByChannelId(UUID channelId);
- List findAllByChannelId(UUID channelId);
+ List findByUserId(UUID userId);
- boolean existsById(UUID id);
+ Optional findByChannelIdAndUserId(UUID channelId, UUID userId );
- void deleteById(UUID id);
-
- void deleteAllByChannelId(UUID channelId);
+ void delete(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
index 2d1df6c8..7d74a4e5 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
@@ -7,20 +7,19 @@
import java.util.UUID;
public interface UserRepository {
+ User save(User user);
- User save(User user);
+ Optional findById(UUID id);
- Optional findById(UUID id);
+ List findAll();
- Optional findByUsername(String username);
+ boolean existsByNickname(String nickname);
- List findAll();
+ boolean existsById(UUID id);
- boolean existsById(UUID id);
+ boolean existsByEmail(String email);
- void deleteById(UUID id);
+ Optional findByNameAndPassword(String name, String password);
- boolean existsByEmail(String email);
-
- boolean existsByUsername(String username);
+ void deleteById(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java
index 3eaa2c32..c63da19f 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java
@@ -7,18 +7,13 @@
import java.util.UUID;
public interface UserStatusRepository {
+ UserStatus save(UserStatus userStatus);
- UserStatus save(UserStatus userStatus);
+ Optional findById(UUID id);
- Optional findById(UUID id);
+ Optional findByUserId(UUID userId);
- Optional findByUserId(UUID userId);
+ List findAll();
- List findAll();
-
- boolean existsById(UUID id);
-
- void deleteById(UUID id);
-
- void deleteByUserId(UUID userId);
+ void delete(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
index d4a773a5..10ac7561 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
@@ -9,120 +9,103 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.*;
import java.util.stream.Stream;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileBinaryContentRepository implements BinaryContentRepository {
+ private final Path DIRECTORY ;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
+ }
- public FileBinaryContentRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- BinaryContent.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public FileBinaryContentRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation,"BinaryContents");
+ createDirectory(DIRECTORY);
}
- this.fileLockProvider = fileLockProvider;
- }
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
- @Override
- public BinaryContent save(BinaryContent binaryContent) {
- Path path = resolvePath(binaryContent.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
+ @Override
+ public BinaryContent save(BinaryContent content) {
+ if (content == null) throw new NoSuchElementException("BinaryContent 객체가 비어있습니다.");
+ if (content.getId() == null) throw new NoSuchElementException("BinaryContent ID를 찾을 수 없습니다.");
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(binaryContent);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ Path path = makePath(content.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(content);
+ oos.close();
+ return content;
+ } catch (IOException e) {
+ return null;
+ }
}
- return binaryContent;
- }
- @Override
- public Optional findById(UUID id) {
- BinaryContent binaryContentNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- binaryContentNullable = (BinaryContent) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
- }
- return Optional.ofNullable(binaryContentNullable);
- }
+ public BinaryContent loadBinaryContent(Path path) {
+ if(Files.notExists(path) || Files.isDirectory(path)) return null;
- @Override
- public List findAllByIdIn(List ids) {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (BinaryContent) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ try(FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ){
+ Object obj = ois.readObject();
+ if (!( obj instanceof BinaryContent)){
+ throw new IllegalArgumentException("파일 내용이 BinaryContent가 아닙니다 :" + path);
}
- })
- .filter(content -> ids.contains(content.getId()))
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (BinaryContent) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("Message 파일 로드 실패 : " + path);
+ return null;
+ }
}
- }
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
+ @Override
+ public List findAllByIdIn(List ids) {
+ if(!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+ Map contentMap = new HashMap<>();
+ try (Stream stream = Files.list(DIRECTORY)){
+ stream.filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .forEach(path ->{
+ BinaryContent content = loadBinaryContent(path);
+ contentMap.put(content.getId(),content);
+ });
+ } catch (IOException e) {
+ throw new NoSuchElementException("경로를 찾을 수 없습니다.");
+ }
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return ids.stream()
+ .map(contentMap::get)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(BinaryContent::getFileName))
+ .toList();
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadBinaryContent(makePath(id)));
+ }
+
+ @Override
+ public void deleteById(UUID id) {
+ try {
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if(!deleted){
+ System.out.println("삭제 실패 : 해당 ID의 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
index c080824a..723e6bd9 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
@@ -9,119 +9,102 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.*;
import java.util.stream.Stream;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileChannelRepository implements ChannelRepository {
+ private final Path DIRECTORY;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
+ }
- public FileChannelRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- Channel.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public FileChannelRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation,"Channels");
+ createDirectory(DIRECTORY);
}
- this.fileLockProvider = fileLockProvider;
- }
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
- @Override
- public Channel save(Channel channel) {
- Path path = resolvePath(channel.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
+ @Override
+ public Channel save(Channel channel) {
+ if (channel == null) throw new NoSuchElementException("채널 객체를 찾을 수 없습니다.");
+ if (channel.getId() == null) throw new IllegalArgumentException("Channel ID를 찾을 수 없습니다.");
+ if (channel.getUserId() == null) throw new IllegalArgumentException("Channel의 작성자 정보가 누락되었습니다.");
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(channel);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ Path path = makePath(channel.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(channel);
+ return channel;
+ } catch (IOException e) {
+ return null;
+ }
}
- return channel;
- }
- @Override
- public Optional findById(UUID id) {
- Channel channelNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- channelNullable = (Channel) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
- }
- return Optional.ofNullable(channelNullable);
- }
+ public Channel loadChannel(Path path) {
+ if (Files.notExists(path) || Files.isDirectory(path)) return null;
- @Override
- public List findAll() {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (Channel) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ try (FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object obj = ois.readObject();
+ if (!(obj instanceof Channel)) {
+ throw new IllegalArgumentException("파일 내용이 Channel이 아닙니다.: " + path);
}
- })
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (Channel) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("Message 파일 로드 실패 : " + path.getFileName() + ": "+e.getMessage());
+ return null;
+ }
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadChannel(makePath(id)));
+ }
+
+ @Override
+ public List findAll() {
+ if (!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+ try (Stream stream = Files.list(DIRECTORY)) {
+ return stream
+ .filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .map(this::loadChannel)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(Channel::getTitle))
+ .toList();
+ } catch (IOException e) {
+ throw new NoSuchElementException("경로를 찾을 수 없습니다.");
+ }
}
- }
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
+ @Override
+ public void delete(UUID id) {
+ try {
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if (!deleted) {
+ System.out.println("삭제 실패 : 해당 ID의 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
+ }
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+ @Override
+ public boolean existsById(UUID id) {
+ return loadChannel(makePath(id)) != null;
}
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileLockProvider.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileLockProvider.java
deleted file mode 100644
index 41f67496..00000000
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileLockProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.sprint.mission.discodeit.repository.file;
-
-import java.nio.file.Path;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReentrantLock;
-import org.springframework.stereotype.Component;
-
-@Component
-public class FileLockProvider {
- private final Map locks = new ConcurrentHashMap<>();
-
- public ReentrantLock getLock(Path path) {
- return locks.computeIfAbsent(path, k -> new ReentrantLock());
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
index bef29af3..1f8bc53b 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
@@ -9,126 +9,110 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.*;
import java.util.stream.Stream;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileMessageRepository implements MessageRepository {
+ private final Path DIRECTORY;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
+ }
- public FileMessageRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- Message.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public FileMessageRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation,"Messages");
+ createDirectory(DIRECTORY);
}
- this.fileLockProvider = fileLockProvider;
- }
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
- @Override
- public Message save(Message message) {
- Path path = resolvePath(message.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
+ @Override
+ public Message save(Message message) {
+ if (message == null) throw new NoSuchElementException("Message 객체가 비어있습니다.");
+ if (message.getId() == null) throw new IllegalArgumentException("Message ID를 찾을 수 없습니다.");
+ if (message.getUserId() == null) throw new IllegalArgumentException("Message의 작성자 정보가 누락되었습니다.");
+ if (message.getChannelId() == null) throw new IllegalArgumentException("Message의 채널 정보가 누락되었습니다.");
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(message);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ Path path = makePath(message.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(message);
+ return message;
+ } catch (IOException e) {
+ return null;
+ }
}
- return message;
- }
- @Override
- public Optional findById(UUID id) {
- Message messageNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- messageNullable = (Message) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
- }
- return Optional.ofNullable(messageNullable);
- }
+ public Message loadMessage(Path path) {
+ if (Files.notExists(path) || Files.isDirectory(path)) return null;
- @Override
- public List findAllByChannelId(UUID channelId) {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (Message) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+ try (FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object obj = ois.readObject();
+ if(!(obj instanceof Message)){
+ throw new IllegalArgumentException("파일 내용이 Message가 아닙니다.: " + path);
}
- })
- .filter(message -> message.getChannelId().equals(channelId))
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (Message) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("Message 파일 로드 실패 : " + path);
+ return null;
+ }
}
- }
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadMessage(makePath(id)));
+ }
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+ @Override
+ public List findAll() {
+ if(!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+ try (Stream stream = Files.list(DIRECTORY)) {
+ return stream
+ .filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .map(this::loadMessage)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(Message::getUpdatedAt))
+ .toList();
+ } catch (IOException e) {
+ throw new NoSuchElementException("경로를 찾을 수 없습니다.");
+ }
}
- }
- @Override
- public void deleteAllByChannelId(UUID channelId) {
- this.findAllByChannelId(channelId)
- .forEach(message -> this.deleteById(message.getId()));
- }
+ @Override
+ public List findByChannelId(UUID id) {
+ return findAll().stream()
+ .filter(message -> message.getChannelId().equals(id))
+ .toList();
+ }
+
+ @Override
+ public boolean existsById(UUID id) {
+ return loadMessage(makePath(id)) != null;
+ }
+
+ @Override
+ public void delete(UUID id) {
+ try {
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if (!deleted) {
+ System.out.println("삭제 실패 : 해당 ID의 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
index 6fc24f9b..11c65bdd 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
@@ -9,152 +9,119 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.*;
import java.util.stream.Stream;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileReadStatusRepository implements ReadStatusRepository {
+ private final Path DIRECTORY ;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
-
- public FileReadStatusRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- ReadStatus.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
}
- this.fileLockProvider = fileLockProvider;
- }
-
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
-
- @Override
- public ReadStatus save(ReadStatus readStatus) {
- Path path = resolvePath(readStatus.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
-
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(readStatus);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
- return readStatus;
- }
-
- @Override
- public Optional findById(UUID id) {
- ReadStatus readStatusNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- readStatusNullable = (ReadStatus) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
+
+
+ public FileReadStatusRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation,"ReadStatuses");
+ createDirectory(DIRECTORY);
}
- return Optional.ofNullable(readStatusNullable);
- }
-
- @Override
- public List findAllByUserId(UUID userId) {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (ReadStatus) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
}
- })
- .filter(readStatus -> readStatus.getUserId().equals(userId))
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public ReadStatus save(ReadStatus readStatus) {
+ if (readStatus.getId() == null) throw new NoSuchElementException("ReadStatus 객체를 찾을 수 없습니다.");
+ if (readStatus.getUserId() == null) throw new IllegalArgumentException("ReadStatus의 유저 정보가 누락되었습니다.");
+ if (readStatus.getChannelId() == null) throw new IllegalArgumentException("ReadStatus의 채널 정보가 누락되었습니다.");
+
+ Path path = makePath(readStatus.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(readStatus);
+ return readStatus;
+ } catch (IOException e) {
+ return null;
+ }
}
- }
-
- @Override
- public List findAllByChannelId(UUID channelId) {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (ReadStatus) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+ public ReadStatus loadReadStatus (Path path) {
+ if(Files.notExists(path) || Files.isDirectory(path)) return null;
+
+ try(FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object obj = ois.readObject();
+ if(!(obj instanceof ReadStatus)){
+ throw new IllegalArgumentException("파일 내용이 ReadStatus가 아닙니다 : " + path);
}
- })
- .filter(readStatus -> readStatus.getChannelId().equals(channelId))
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (ReadStatus) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("ReadStatus 파일 로드 실패 : " + path);
+ return null;
+ }
+ }
+
+ @Override
+ public List findAll() {
+ if(!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+ try (Stream stream = Files.list(DIRECTORY)){
+ return stream
+ .filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .map(this::loadReadStatus)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(ReadStatus::getUpdatedAt))
+ .toList();
+ } catch (IOException e) {
+ throw new NoSuchElementException("경로를 찾을 수 없습니다.");
+ }
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadReadStatus(makePath(id)));
+ }
+
+ @Override
+ public List findByChannelId(UUID channelId) {
+ return findAll().stream()
+ .filter(status -> status.getChannelId().equals(channelId))
+ .toList();
}
- }
-
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
-
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+
+ @Override
+ public List findByUserId(UUID userId) {
+ return findAll().stream()
+ .filter(status -> status.getUserId().equals(userId))
+ .toList();
+ }
+
+ @Override
+ public Optional findByChannelIdAndUserId(UUID channelId, UUID userId) {
+ return findAll().stream()
+ .filter(status -> status.getChannelId().equals(channelId) && status.getUserId().equals(userId))
+ .findFirst();
}
- }
- @Override
- public void deleteAllByChannelId(UUID channelId) {
- this.findAllByChannelId(channelId)
- .forEach(readStatus -> this.deleteById(readStatus.getId()));
- }
+ @Override
+ public void delete(UUID id) {
+ try{
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if(!deleted){
+ System.out.println("삭제 실패 : 해당 ID의 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
index 2dc63b05..6c952545 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
@@ -2,148 +2,127 @@
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.UserRepository;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.stream.Stream;
+
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileUserRepository implements UserRepository {
+ private final Path DIRECTORY;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
-
- public FileUserRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- User.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
}
- this.fileLockProvider = fileLockProvider;
- }
-
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
-
- @Override
- public User save(User user) {
- Path path = resolvePath(user.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
-
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(user);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+ public FileUserRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation, "Users");
+ createDirectory(DIRECTORY);
}
- return user;
- }
-
- @Override
- public Optional findById(UUID id) {
- User userNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- userNullable = (User) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
+
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
- return Optional.ofNullable(userNullable);
- }
-
- @Override
- public Optional findByUsername(String username) {
- return this.findAll().stream()
- .filter(user -> user.getUsername().equals(username))
- .findFirst();
- }
-
- @Override
- public List findAll() {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (User) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+ @Override
+ public User save(User user) {
+ if (user == null) throw new NoSuchElementException("채널 객체를 찾을 수 없습니다.");
+ if (user.getId() == null) throw new IllegalArgumentException("User ID를 찾을 수 없습니다.");
+
+ Path path = makePath(user.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(user);
+ return user;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public User loadUser(Path path) {
+ if (Files.notExists(path) || Files.isDirectory(path)) return null;
+
+ try (FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object obj = ois.readObject();
+ if (!(obj instanceof User)) {
+ throw new IllegalArgumentException("파일 내용이 User가 아닙니다.: " + path);
}
- })
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (User) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("파일 로드 실패 : " + path);
+ return null;
+ }
}
- }
-
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
-
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadUser(makePath(id)));
+ }
+
+ @Override
+ public List findAll() {
+ if (!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+ try (Stream stream = Files.list(DIRECTORY)) {
+ return stream
+ .filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .map(this::loadUser)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(User::getNickname))
+ .toList();
+ } catch (IOException e) {
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public boolean existsByNickname(String nickname) {
+ return findAll().stream()
+ .anyMatch(user -> user.getNickname().equals(nickname));
+ }
+
+ @Override
+ public boolean existsById(UUID id) {
+ return loadUser(makePath(id)) != null;
+ }
+
+ @Override
+ public boolean existsByEmail(String email) {
+ return findAll().stream()
+ .anyMatch(user -> user.getEmail().equals(email));
+ }
+
+ @Override
+ public Optional findByNameAndPassword(String name, String password) {
+ return findAll().stream()
+ .filter(user -> user.getName().equals(name) && user.getPassword().equals(password))
+ .findFirst();
+ }
+
+ @Override
+ public void deleteById(UUID id) {
+ try {
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if (!deleted){
+ System.out.println("삭제 실패 : 해당 ID의 user 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
}
- }
-
- @Override
- public boolean existsByEmail(String email) {
- return this.findAll().stream()
- .anyMatch(user -> user.getEmail().equals(email));
- }
-
- @Override
- public boolean existsByUsername(String username) {
- return this.findAll().stream()
- .anyMatch(user -> user.getUsername().equals(username));
- }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
index c8daf8b9..fda8bb3c 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
@@ -9,132 +9,105 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.*;
import java.util.stream.Stream;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "file")
public class FileUserStatusRepository implements UserStatusRepository {
+ private final Path DIRECTORY;
+ private final String EXTENSION = ".ser";
- private final Path DIRECTORY;
- private final String EXTENSION = ".ser";
- private final FileLockProvider fileLockProvider;
-
- public FileUserStatusRepository(
- @Value("${discodeit.repository.file-directory:data}") String fileDirectory,
- FileLockProvider fileLockProvider
- ) {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory,
- UserStatus.class.getSimpleName());
- if (Files.notExists(DIRECTORY)) {
- try {
- Files.createDirectories(DIRECTORY);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ public Path makePath(UUID id) {
+ return DIRECTORY.resolve(id + EXTENSION);
}
- this.fileLockProvider = fileLockProvider;
- }
-
- private Path resolvePath(UUID id) {
- return DIRECTORY.resolve(id + EXTENSION);
- }
-
- @Override
- public UserStatus save(UserStatus userStatus) {
- Path path = resolvePath(userStatus.getId());
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
-
- try (
- FileOutputStream fos = new FileOutputStream(path.toFile());
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- ) {
- oos.writeObject(userStatus);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+
+ public FileUserStatusRepository(@Value("${storage.location}") String storageLocation) {
+ DIRECTORY = Path.of(storageLocation,"UserStatuses");
+ createDirectory(DIRECTORY);
}
- return userStatus;
- }
-
- @Override
- public Optional findById(UUID id) {
- UserStatus userStatusNullable = null;
- Path path = resolvePath(id);
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- if (Files.exists(path)) {
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- userStatusNullable = (UserStatus) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
+
+ public void createDirectory(Path path) {
+ if (Files.notExists(path)) {
+ try {
+ Files.createDirectories(path);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
- return Optional.ofNullable(userStatusNullable);
- }
-
- @Override
- public Optional findByUserId(UUID userId) {
- return findAll().stream()
- .filter(userStatus -> userStatus.getUserId().equals(userId))
- .findFirst();
- }
-
- @Override
- public List findAll() {
- try (Stream paths = Files.list(DIRECTORY)) {
- return paths
- .filter(path -> path.toString().endsWith(EXTENSION))
- .map(path -> {
- ReentrantLock lock = fileLockProvider.getLock(path);
- lock.lock();
- try (
- FileInputStream fis = new FileInputStream(path.toFile());
- ObjectInputStream ois = new ObjectInputStream(fis)
- ) {
- return (UserStatus) ois.readObject();
- } catch (IOException | ClassNotFoundException e) {
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
+
+ @Override
+ public UserStatus save(UserStatus userStatus) {
+ if (userStatus.getId() == null) throw new NoSuchElementException("UserStatus 객체를 찾을 수 없습니다.");
+ if (userStatus.getUserId() == null) throw new IllegalArgumentException("UserStatus의 유저 정보가 누락되었습니다.");
+
+ Path path = makePath(userStatus.getId());
+ try (FileOutputStream fos = new FileOutputStream(path.toFile());
+ ObjectOutputStream oos = new ObjectOutputStream(fos)
+ ) {
+ oos.writeObject(userStatus);
+ return userStatus;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public UserStatus loadUserStatus(Path path) {
+ if (Files.notExists(path) || Files.isDirectory(path)) return null;
+
+ try (FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ Object obj = ois.readObject();
+ if (!(obj instanceof UserStatus)) {
+ throw new IllegalArgumentException("파일 내용이 UserStatus가 아닙니다 : " + path);
}
- })
- .toList();
- } catch (IOException e) {
- throw new RuntimeException(e);
+ return (UserStatus) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ System.err.println("UserStatus 파일 로드 실패 : " + path);
+ return null;
+ }
}
- }
-
- @Override
- public boolean existsById(UUID id) {
- Path path = resolvePath(id);
- return Files.exists(path);
- }
-
- @Override
- public void deleteById(UUID id) {
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(loadUserStatus(makePath(id)));
+ }
+
+ @Override
+ public Optional findByUserId(UUID userId) {
+ return findAll().stream()
+ .filter(status -> status.getUserId().equals(userId))
+ .findFirst();
+ }
+
+ @Override
+ public List findAll() {
+ if(!Files.isDirectory(DIRECTORY)) return Collections.emptyList();
+
+ try (Stream stream = Files.list(DIRECTORY)){
+ return stream
+ .filter(path -> path.getFileName().toString().endsWith(EXTENSION))
+ .map(this::loadUserStatus)
+ .filter(Objects::nonNull)
+ .sorted(Comparator.comparing(UserStatus::getUpdatedAt))
+ .toList();
+ } catch (IOException e) {
+ return Collections.emptyList();
+ }
}
- }
- @Override
- public void deleteByUserId(UUID userId) {
- this.findByUserId(userId)
- .ifPresent(userStatus -> this.deleteById(userStatus.getId()));
- }
+ @Override
+ public void delete(UUID id) {
+ try{
+ boolean deleted = Files.deleteIfExists(makePath(id));
+ if(!deleted){
+ System.out.println("삭제 실패 : 해당 ID의 UserStatus 파일이 존재하지 않습니다.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일 삭제 중 오류 발생", e);
+ }
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
index e614e5ca..0d31ecdd 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
@@ -7,41 +7,34 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFBinaryContentRepository implements BinaryContentRepository {
-
- private final Map data;
-
- public JCFBinaryContentRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public BinaryContent save(BinaryContent binaryContent) {
- this.data.put(binaryContent.getId(), binaryContent);
- return binaryContent;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public List findAllByIdIn(List ids) {
- return this.data.values().stream()
- .filter(content -> ids.contains(content.getId()))
- .toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
+ private final Map data = new HashMap<>();
+
+ @Override
+ public BinaryContent save(BinaryContent content) {
+ if (content == null) throw new NoSuchElementException("Binary Content객체가 비어있습니다");
+ if (content.getId() == null) throw new IllegalArgumentException("BinaryContent ID를 찾을 수 없습니다.");
+ data.put(content.getId(),content);
+ return data.get(content.getId());
+ }
+
+ @Override
+ public List findAllByIdIn(List ids) {
+ return ids.stream()
+ .map(data::get)
+ .filter(Objects::nonNull)
+ .toList();
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public void deleteById(UUID id) {
+ data.remove(id);
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
index 1066ab48..3296863b 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
@@ -7,39 +7,36 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFChannelRepository implements ChannelRepository {
-
- private final Map data;
-
- public JCFChannelRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public Channel save(Channel channel) {
- this.data.put(channel.getId(), channel);
- return channel;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public List findAll() {
- return this.data.values().stream().toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
+ private final Map data = new HashMap<>();
+
+ @Override
+ public Channel save(Channel channel) {
+ if (channel == null) throw new NoSuchElementException("Channel 객체가 비어있습니다.");
+ if (channel.getId() == null) throw new IllegalArgumentException("Channel ID를 찾을 수 없습니다.");
+ data.put(channel.getId(), channel);
+ return data.get(channel.getId());
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(data.values());
+ }
+
+ @Override
+ public void delete(UUID id) {
+ data.remove(id);
+ }
+
+ @Override
+ public boolean existsById(UUID id) {
+ return data.get(id) != null;
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
index 1d844828..6b36ef81 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
@@ -7,46 +7,43 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFMessageRepository implements MessageRepository {
-
- private final Map data;
-
- public JCFMessageRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public Message save(Message message) {
- this.data.put(message.getId(), message);
- return message;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public List findAllByChannelId(UUID channelId) {
- return this.data.values().stream().filter(message -> message.getChannelId().equals(channelId))
- .toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
-
- @Override
- public void deleteAllByChannelId(UUID channelId) {
- this.findAllByChannelId(channelId)
- .forEach(message -> this.deleteById(message.getId()));
- }
+ private final Map data = new HashMap<>();
+
+ @Override
+ public Message save(Message message) {
+ if (message == null) throw new NoSuchElementException("Message 객체가 비어있습니다.");
+ if (message.getId() == null) throw new IllegalArgumentException("Message ID를 찾을 수 없습니다.");
+ data.put(message.getId(), message);
+ return data.get(message.getId());
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(data.values());
+ }
+
+ @Override
+ public List findByChannelId(UUID id) {
+ return data.values().stream()
+ .filter(message -> message.getChannelId().equals(id))
+ .toList();
+ }
+
+ @Override
+ public boolean existsById(UUID id) {
+ return data.get(id) !=null;
+ }
+
+ @Override
+ public void delete(UUID id) {
+ data.remove(id);
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
index 0cf82c95..69c98f80 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
@@ -7,54 +7,57 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFReadStatusRepository implements ReadStatusRepository {
-
- private final Map data;
-
- public JCFReadStatusRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public ReadStatus save(ReadStatus readStatus) {
- this.data.put(readStatus.getId(), readStatus);
- return readStatus;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public List findAllByUserId(UUID userId) {
- return this.data.values().stream()
- .filter(readStatus -> readStatus.getUserId().equals(userId))
- .toList();
- }
-
- @Override
- public List findAllByChannelId(UUID channelId) {
- return this.data.values().stream()
- .filter(readStatus -> readStatus.getChannelId().equals(channelId))
- .toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
-
- @Override
- public void deleteAllByChannelId(UUID channelId) {
- this.findAllByChannelId(channelId)
- .forEach(readStatus -> this.deleteById(readStatus.getId()));
- }
+ private final Map data = new HashMap<>();
+
+ @Override
+ public ReadStatus save(ReadStatus readStatus) {
+ if(readStatus == null){
+ throw new NoSuchElementException("ReadStatus 객체가 비어있습니다.");
+ }
+ if(readStatus.getId() == null){
+ throw new NoSuchElementException("ReadStatus ID를 찾을 수 없습니다.");
+ }
+ data.put(readStatus.getId(),readStatus);
+ return data.get(readStatus.getId());
+ }
+
+ @Override
+ public List findAll() {
+ return data.values().stream().toList();
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public List findByChannelId(UUID channelId) {
+ return data.values().stream()
+ .filter(status->status.getChannelId().equals(channelId))
+ .toList();
+ }
+
+ @Override
+ public List findByUserId(UUID userId) {
+ return data.values().stream()
+ .filter(status->status.getUserId().equals(userId))
+ .toList();
+ }
+
+ @Override
+ public Optional findByChannelIdAndUserId(UUID channelId, UUID userId) {
+ return data.values().stream()
+ .filter(status->
+ status.getChannelId().equals(channelId) && status.getUserId().equals(userId))
+ .findFirst();
+ }
+
+ @Override
+ public void delete(UUID id) {
+ data.remove(id);
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
index 71e7d8fe..1effdcf1 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
@@ -7,56 +7,67 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFUserRepository implements UserRepository {
+ private final Map data = new HashMap<>();
- private final Map data;
-
- public JCFUserRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public User save(User user) {
- this.data.put(user.getId(), user);
- return user;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public Optional findByUsername(String username) {
- return this.findAll().stream()
- .filter(user -> user.getUsername().equals(username))
- .findFirst();
- }
-
- @Override
- public List findAll() {
- return this.data.values().stream().toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
-
- @Override
- public boolean existsByEmail(String email) {
- return this.findAll().stream().anyMatch(user -> user.getEmail().equals(email));
- }
-
- @Override
- public boolean existsByUsername(String username) {
- return this.findAll().stream().anyMatch(user -> user.getUsername().equals(username));
- }
+ @Override
+ public User save(User user) {
+ if (user == null) throw new NoSuchElementException("User 객체가 비어있습니다.");
+ if (user.getId() == null) throw new IllegalArgumentException("User ID를 찾을 수 없습니다.");
+ data.put(user.getId(), user);
+ return data.get(user.getId());
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(data.values());
+ }
+
+ @Override
+ public boolean existsByNickname(String nickname) {
+ boolean result = false;
+ for(User user : data.values()){
+ if (user.getNickname().equals(nickname)) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean existsById(UUID id) {
+ return data.get(id) != null;
+ }
+
+ @Override
+ public boolean existsByEmail(String email) {
+ boolean result = false;
+ for(User user : data.values()){
+ if (user.getEmail().equals(email)) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public Optional findByNameAndPassword(String name, String password) {
+ return data.values().stream()
+ .filter(user -> user.getName().equals(name) && user.getPassword().equals(password))
+ .findFirst();
+ }
+
+ @Override
+ public void deleteById(UUID id) {
+ data.remove(id);
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
index d505497e..076174f9 100644
--- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
+++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
@@ -7,52 +7,38 @@
import java.util.*;
-@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
+@ConditionalOnProperty(name = "spring.service.type", havingValue = "jcf")
public class JCFUserStatusRepository implements UserStatusRepository {
-
- private final Map data;
-
- public JCFUserStatusRepository() {
- this.data = new HashMap<>();
- }
-
- @Override
- public UserStatus save(UserStatus userStatus) {
- this.data.put(userStatus.getId(), userStatus);
- return userStatus;
- }
-
- @Override
- public Optional findById(UUID id) {
- return Optional.ofNullable(this.data.get(id));
- }
-
- @Override
- public Optional findByUserId(UUID userId) {
- return this.findAll().stream()
- .filter(userStatus -> userStatus.getUserId().equals(userId))
- .findFirst();
- }
-
- @Override
- public List findAll() {
- return this.data.values().stream().toList();
- }
-
- @Override
- public boolean existsById(UUID id) {
- return this.data.containsKey(id);
- }
-
- @Override
- public void deleteById(UUID id) {
- this.data.remove(id);
- }
-
- @Override
- public void deleteByUserId(UUID userId) {
- this.findByUserId(userId)
- .ifPresent(userStatus -> this.deleteByUserId(userStatus.getId()));
- }
+ private final Map data = new HashMap<>();
+
+ @Override
+ public UserStatus save(UserStatus userStatus) {
+ if(userStatus ==null) throw new NoSuchElementException("User Status객체가 비어있습니다");
+ if(userStatus.getId() == null) throw new IllegalArgumentException("User Statis ID를 찾을 수 없습니다.");
+ data.put(userStatus.getId(),userStatus);
+ return data.get(userStatus.getId());
+ }
+
+ @Override
+ public Optional findById(UUID id) {
+ return Optional.ofNullable(data.get(id));
+ }
+
+ @Override
+ public Optional findByUserId(UUID userId) {
+ return data.values().stream()
+ .filter(status -> status.getUserId().equals(userId))
+ .findFirst();
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(data.values());
+ }
+
+ @Override
+ public void delete(UUID id) {
+ data.remove(id);
+ }
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
index c81cb51d..88bdd2af 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
@@ -1,9 +1,8 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.request.LoginRequest;
-import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.dto.auth.LoginRequest;
+import com.sprint.mission.discodeit.dto.auth.LoginResponse;
public interface AuthService {
-
- User login(LoginRequest loginRequest);
+ LoginResponse login(LoginRequest request);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java
index df448b89..fc7092b7 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java
@@ -1,18 +1,14 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.entity.BinaryContent;
+import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentRequest;
+import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentResponse;
import java.util.List;
import java.util.UUID;
public interface BinaryContentService {
-
- BinaryContent create(BinaryContentCreateRequest request);
-
- BinaryContent find(UUID binaryContentId);
-
- List findAllByIdIn(List binaryContentIds);
-
- void delete(UUID binaryContentId);
+ BinaryContentResponse create (BinaryContentRequest request);
+ BinaryContentResponse find (UUID id);
+ List findAllByIdIn (List ids);
+ void delete (UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
index b165ae1a..a51ea4d7 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
@@ -1,26 +1,20 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.data.ChannelDto;
-import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest;
-import com.sprint.mission.discodeit.entity.Channel;
-import com.sprint.mission.discodeit.entity.ChannelType;
+import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest;
+import com.sprint.mission.discodeit.dto.channel.ChannelResponse;
+import com.sprint.mission.discodeit.dto.channel.ChannelUpdateRequest;
+import com.sprint.mission.discodeit.dto.channel.PrivateChannelCreateRequest;
import java.util.List;
import java.util.UUID;
public interface ChannelService {
- Channel create(PublicChannelCreateRequest request);
-
- Channel create(PrivateChannelCreateRequest request);
-
- ChannelDto find(UUID channelId);
-
- List findAllByUserId(UUID userId);
-
- Channel update(UUID channelId, PublicChannelUpdateRequest request);
-
- void delete(UUID channelId);
-}
\ No newline at end of file
+ ChannelResponse createPublicChannel(ChannelCreateRequest request);
+ ChannelResponse createPrivateChannel(PrivateChannelCreateRequest request);
+ ChannelResponse findById(UUID id);
+ List findAllByUserId(UUID userId);
+ List findAll();
+ ChannelResponse update(ChannelUpdateRequest channel);
+ void delete(UUID id);
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/AuthServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/AuthServiceImpl.java
new file mode 100644
index 00000000..d01713f1
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/AuthServiceImpl.java
@@ -0,0 +1,33 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.auth.LoginRequest;
+import com.sprint.mission.discodeit.dto.auth.LoginResponse;
+import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.service.AuthService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.NoSuchElementException;
+
+@Service
+@RequiredArgsConstructor
+public class AuthServiceImpl implements AuthService{
+ private final UserRepository userRepository;
+
+ @Override
+ public LoginResponse login(LoginRequest request) {
+ User user = userRepository.findByNameAndPassword(request.name(),request.password())
+ .orElseThrow(()-> new NoSuchElementException("로그인 실패"));
+
+ return convertToResponse(user);
+ }
+
+ public LoginResponse convertToResponse(User user) {
+ return new LoginResponse(
+ user.getId(),
+ Instant.now()
+ );
+ }
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/BinaryContentServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/BinaryContentServiceImpl.java
new file mode 100644
index 00000000..e48f0cce
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/BinaryContentServiceImpl.java
@@ -0,0 +1,68 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentRequest;
+import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentResponse;
+import com.sprint.mission.discodeit.entity.BinaryContent;
+import com.sprint.mission.discodeit.repository.BinaryContentRepository;
+import com.sprint.mission.discodeit.service.BinaryContentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class BinaryContentServiceImpl implements BinaryContentService {
+ private final BinaryContentRepository binaryContentRepository;
+
+ @Override
+ public BinaryContentResponse create(BinaryContentRequest request) {
+ BinaryContent content = new BinaryContent(
+ request.fileName(),
+ request.url()
+ );
+ BinaryContent savedContent = binaryContentRepository.save(content);
+ return convertToResponse(savedContent);
+ }
+
+ public BinaryContentResponse convertToResponse(BinaryContent content){
+ return new BinaryContentResponse(
+ content.getId(),
+ content.getFileName(),
+ content.getUrl()
+ );
+ }
+
+ @Override
+ public BinaryContentResponse find(UUID id) {
+ BinaryContent content = binaryContentRepository.findById(id)
+ .orElseThrow(()-> new NoSuchElementException("존재하지 않는 컨텐츠입니다."));
+ return convertToResponse(content);
+ }
+
+ @Override
+ public List findAllByIdIn(List ids) {
+ if(ids == null || ids.isEmpty()){
+ return Collections.emptyList();
+ }
+ List contents = binaryContentRepository.findAllByIdIn(ids);
+ if(contents.isEmpty()) return Collections.emptyList();
+
+ if(contents.size() != ids.size()){
+ throw new NoSuchElementException("요청한 ID 중 일부를 찾을 수 없습니다.");
+ }
+ return contents.stream()
+ .map(this::convertToResponse)
+ .toList();
+ }
+
+ @Override
+ public void delete(UUID id) {
+ binaryContentRepository.findById(id)
+ .orElseThrow(()-> new NoSuchElementException("존재하지 않는 컨텐츠입니다."));
+ binaryContentRepository.deleteById(id);
+ }
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/ChannelServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/ChannelServiceImpl.java
new file mode 100644
index 00000000..a798eb76
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/ChannelServiceImpl.java
@@ -0,0 +1,158 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest;
+import com.sprint.mission.discodeit.dto.channel.ChannelResponse;
+import com.sprint.mission.discodeit.dto.channel.ChannelUpdateRequest;
+import com.sprint.mission.discodeit.dto.channel.PrivateChannelCreateRequest;
+import com.sprint.mission.discodeit.entity.*;
+import com.sprint.mission.discodeit.repository.ChannelRepository;
+import com.sprint.mission.discodeit.repository.MessageRepository;
+import com.sprint.mission.discodeit.repository.ReadStatusRepository;
+import com.sprint.mission.discodeit.service.ChannelService;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class ChannelServiceImpl implements ChannelService {
+ private final ChannelRepository channelRepository;
+ private final ReadStatusRepository readStatusRepository;
+ private final MessageRepository messageRepository;
+
+ @Override
+ public ChannelResponse createPublicChannel(ChannelCreateRequest request) {
+ Channel channel = new Channel(
+ ChannelType.PUBLIC,
+ request.title(),
+ request.userId(),
+ request.description()
+ );
+ return convertToResponse(channelRepository.save(channel), null);
+ }
+
+ @Override
+ public ChannelResponse createPrivateChannel(PrivateChannelCreateRequest request) {
+ Channel channel = new Channel(
+ ChannelType.PRIVATE,
+ null,
+ request.userId(),
+ null
+ );
+ Channel savedChannel = channelRepository.save(channel);
+
+ request.memberIds().forEach(memberId -> {
+ ReadStatus readStatus = new ReadStatus(memberId, savedChannel.getId());
+ readStatusRepository.save(readStatus);
+ });
+
+ return convertToResponse(savedChannel, request.memberIds());
+ }
+
+ public ChannelResponse convertToResponse(Channel channel, List memberIds) {
+ return new ChannelResponse(
+ channel.getId(),
+ channel.getUserId(),
+ channel.getTitle(),
+ channel.getDescription(),
+ channel.getType(),
+ channel.getUpdatedAt(),
+ memberIds
+ );
+ }
+
+ @Override
+ public ChannelResponse findById(UUID id) {
+ Channel channel = channelRepository.findById(id)
+ .orElseThrow(() -> new NoSuchElementException("채널을 찾을 수 없습니다."));
+
+ List memberIds = null;
+ if (channel.getType() == ChannelType.PRIVATE) {
+ memberIds = readStatusRepository.findByChannelId(id).stream()
+ .map(ReadStatus::getUserId)
+ .toList();
+ }
+ return convertToResponse(channel, memberIds);
+ }
+
+ @Override
+ public List findAllByUserId(UUID userId) {
+ List channels = channelRepository.findAll();
+ List statuses = readStatusRepository.findAll();
+
+ return channels.stream()
+ .filter(channel -> {
+ // public은 전부 다 받음.
+ if (channel.getType() == ChannelType.PUBLIC) return true;
+
+ return statuses.stream()
+ //해당 channel에 속해있는 status인지 확인
+ .anyMatch(s -> s.getChannelId().equals(channel.getId())
+ // 제시된 user와 id가 같은것만 추출.
+ && s.getUserId().equals(userId));
+ })
+ .map(channel -> {
+ List members = null;
+ if (channel.getType() == ChannelType.PRIVATE) {
+ members = statuses.stream()
+ .filter(s -> s.getChannelId().equals(channel.getId()))
+ .map(ReadStatus::getUserId)
+ .toList();
+ }
+ return convertToResponse(channel, members);
+ })
+ .toList();
+ }
+
+ @Override
+ public List findAll() {
+ List list = channelRepository.findAll();
+ return list.stream()
+ .map(channel -> convertToResponse(channel,null))
+ .toList();
+ }
+
+ @Override
+ public ChannelResponse update(ChannelUpdateRequest request) {
+ Channel channel = channelRepository.findById(request.id()).
+ orElseThrow(() -> new NoSuchElementException("해당 채널이 존재하지 않습니다"));
+
+ if (channel.getType() == ChannelType.PRIVATE) {
+ throw new IllegalStateException("PRIVATE 채널은 수정할 수 없습니다.");
+ }
+
+ channel.update(request.title(), request.description());
+
+ Channel updatedChannel = channelRepository.save(channel);
+ return convertToResponse(updatedChannel, null);
+ }
+
+ @Override
+ public void delete(UUID id) {
+ if(!channelRepository.existsById(id)){
+ throw new NoSuchElementException("해당 채널이 존재하지 않습니다.");
+ }
+ List messages = messageRepository.findByChannelId(id);
+ messages.forEach(message -> messageRepository.delete(message.getId()));
+
+ List statuses = readStatusRepository.findByChannelId(id);
+ statuses.forEach(status -> readStatusRepository.delete(status.getId()));
+
+ channelRepository.delete(id);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/MessageServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/MessageServiceImpl.java
new file mode 100644
index 00000000..5a32615e
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/MessageServiceImpl.java
@@ -0,0 +1,103 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.message.MessageCreateRequest;
+import com.sprint.mission.discodeit.dto.message.MessageResponse;
+import com.sprint.mission.discodeit.dto.message.MessageUpdateRequest;
+import com.sprint.mission.discodeit.entity.Message;
+import com.sprint.mission.discodeit.repository.BinaryContentRepository;
+import com.sprint.mission.discodeit.repository.ChannelRepository;
+import com.sprint.mission.discodeit.repository.MessageRepository;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.service.MessageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@RequiredArgsConstructor
+public class MessageServiceImpl implements MessageService {
+ private final MessageRepository messageRepository;
+ private final ChannelRepository channelRepository;
+ private final UserRepository userRepository;
+ private final BinaryContentRepository binaryContentRepository;
+
+ @Override
+ public MessageResponse create(MessageCreateRequest request) {
+
+ if(!channelRepository.existsById(request.channelId())){
+ throw new NoSuchElementException("존재하지 않는 채널에 메시지를 작성할 수 없습니다.");
+ }
+ if(!userRepository.existsById(request.userId())){
+ throw new NoSuchElementException("존재하지 않는 채널에 메시지를 작성할 수 없습니다.");
+ }
+ Message message = new Message(
+ request.channelId(),
+ request.userId(),
+ request.title(),
+ request.content(),
+ request.attachmentIds()
+ );
+ return convertToResponse(messageRepository.save(message));
+ }
+
+ public MessageResponse convertToResponse(Message message){
+ return new MessageResponse(
+ message.getId(),
+ message.getChannelId(),
+ message.getUserId(),
+ message.getTitle(),
+ message.getContent(),
+ message.getAttachmentIds()
+ );
+ }
+
+ @Override
+ public List findByChannelId(UUID id) {
+ List messages = messageRepository.findByChannelId(id);
+ if(messages.isEmpty()) return Collections.emptyList();
+
+ List messageResponses = new ArrayList<>();
+ messages.forEach(message -> messageResponses.add(convertToResponse(message)));
+
+ return messageResponses;
+ }
+
+ @Override
+ public MessageResponse update(MessageUpdateRequest request) {
+ Message message = messageRepository.findById(request.id())
+ .orElseThrow(() -> new NoSuchElementException("해당 Message가 존재하지 않습니다."));
+
+ message.update(
+ request.title(),
+ request.content()
+ );
+ Message updatedMessage = messageRepository.save(message);
+ return convertToResponse(updatedMessage);
+ }
+
+ @Override
+ public void delete(UUID id) {
+ if (!messageRepository.existsById(id)){
+ throw new NoSuchElementException("해당 메시지가 존재하지 않습니다.");
+ }
+ List attachmentIds = messageRepository.findById(id)
+ .orElseThrow(() ->
+ new NoSuchElementException("해당 Message가 존재하지 않습니다."))
+ .getAttachmentIds();
+ attachmentIds.forEach(binaryContentRepository::deleteById);
+
+ messageRepository.delete(id);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/ReadStatusServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/ReadStatusServiceImpl.java
new file mode 100644
index 00000000..c4e69002
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/ReadStatusServiceImpl.java
@@ -0,0 +1,87 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.status.ReadStatusResponse;
+import com.sprint.mission.discodeit.dto.status.ReadStatusUpdateRequest;
+import com.sprint.mission.discodeit.dto.status.ReadStatuscreateRequest;
+import com.sprint.mission.discodeit.entity.ReadStatus;
+import com.sprint.mission.discodeit.repository.ChannelRepository;
+import com.sprint.mission.discodeit.repository.ReadStatusRepository;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.service.ReadStatusService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class ReadStatusServiceImpl implements ReadStatusService {
+ private final ReadStatusRepository readStatusRepository;
+ private final UserRepository userRepository;
+ private final ChannelRepository channelRepository;
+
+ @Override
+ public ReadStatusResponse create(ReadStatuscreateRequest request) {
+ if (!userRepository.existsById(request.userId())) {
+ throw new NoSuchElementException("존재하지 않는 유저입니다.");
+ }
+ if (!channelRepository.existsById(request.channelId())) {
+ throw new NoSuchElementException("존재하지 않는 채널입니다.");
+ }
+
+ readStatusRepository.findByChannelIdAndUserId(request.channelId(),request.userId())
+ .orElseThrow(()-> new IllegalStateException("이미 해당 채널에 참여중인 유저입니다."));
+
+ ReadStatus readStatus = new ReadStatus(request.userId(), request.channelId());
+ ReadStatus savedReadStatus = readStatusRepository.save(readStatus);
+ return convertToResponse(savedReadStatus);
+ }
+
+ public ReadStatusResponse convertToResponse(ReadStatus readStatus) {
+ return new ReadStatusResponse(
+ readStatus.getId(),
+ readStatus.getUserId(),
+ readStatus.getChannelId(),
+ readStatus.getCreatedAt(),
+ readStatus.getUpdatedAt()
+ );
+ }
+
+ @Override
+ public ReadStatusResponse find(UUID id) {
+ ReadStatus status = readStatusRepository.findById(id)
+ .orElseThrow(()-> new NoSuchElementException("해당 유저가 존재하지 않습니다.")); // optional 사용? ReadStatus 사용?
+ return convertToResponse(status);
+ }
+
+ @Override
+ public List findAllByUserId(UUID userId) {
+ List statuses = readStatusRepository.findByUserId(userId);
+ if(statuses.isEmpty()) return Collections.emptyList();
+
+
+ return statuses.stream()
+ .map(this::convertToResponse)
+ .toList();
+ }
+
+ @Override
+ public ReadStatusResponse update(ReadStatusUpdateRequest request) {
+ ReadStatus status = readStatusRepository.findById(request.id())
+ .orElseThrow(()-> new NoSuchElementException("참여 상태를 찾을 수 없습니다."));
+
+ status.updateReadTime();
+ return convertToResponse(status);
+ }
+
+ @Override
+ public void delete(UUID id) {
+ if (readStatusRepository.findById(id).isEmpty()) {
+ throw new NoSuchElementException("참여 상태를 찾을 수 없습니다.");
+ }
+ readStatusRepository.delete(id);
+ }
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/UserServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/UserServiceImpl.java
new file mode 100644
index 00000000..15a8d46b
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/UserServiceImpl.java
@@ -0,0 +1,124 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.user.UserCreateRequest;
+import com.sprint.mission.discodeit.dto.user.UserResponse;
+import com.sprint.mission.discodeit.dto.user.UserUpdateRequest;
+import com.sprint.mission.discodeit.entity.BinaryContent;
+import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.entity.UserStatus;
+import com.sprint.mission.discodeit.repository.BinaryContentRepository;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.repository.UserStatusRepository;
+import com.sprint.mission.discodeit.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
+ private final UserRepository userRepository;
+ private final UserStatusRepository userStatusRepository;
+ private final BinaryContentRepository binaryContentRepository;
+
+ @Override
+ public UserResponse create(UserCreateRequest request) {
+ if (userRepository.existsByEmail(request.email()))
+ throw new IllegalStateException("이미 가입된 email 입니다.");
+
+ if (userRepository.existsByNickname(request.nickname()))
+ throw new IllegalStateException("이미 사용중인 닉네임 입니다.");
+
+ BinaryContent profile = null;
+ if (request.profileUrl() != null) {
+ profile = new BinaryContent(request.profileFileName(), request.profileUrl());
+ binaryContentRepository.save(profile);
+ }
+
+ User user = new User(profile, request.name(), request.email(), request.nickname(), request.password());
+ UserStatus status = new UserStatus(user.getId());
+
+ userRepository.save(user);
+ userStatusRepository.save(status);
+
+ return convertToResponse(user, status);
+ }
+
+ public UserResponse convertToResponse(User user, UserStatus status) {
+ return new UserResponse(
+ user.getId(),
+ user.getName(),
+ user.getEmail(),
+ user.getNickname(),
+ user.getProfileId(),
+ status.isOnline()
+ );
+ }
+
+ @Override
+ public UserResponse findById(UUID id) {
+ User user = userRepository.findById(id)
+ .orElseThrow(()->new NoSuchElementException("유저를 찾을 수 없습니다."));
+ UserStatus status = userStatusRepository.findByUserId(id)
+ .orElseThrow(()-> new NoSuchElementException("상태 정보를 찾을 수 없습니다."));
+ return convertToResponse(user, status);
+ }
+
+ @Override
+ public List findAll() {
+ List statuses = userStatusRepository.findAll();
+ if(statuses.isEmpty()) return Collections.emptyList();
+
+ Map statusMap = statuses.stream()
+ .collect(Collectors.toMap(UserStatus::getUserId,status -> status));
+
+ return userRepository.findAll().stream()
+ .map(user ->{
+ UserStatus status = statusMap.get(user.getId());
+ return convertToResponse(user,status);
+ })
+ .toList();
+ }
+
+ @Override
+ public UserResponse update(UserUpdateRequest request) {
+ User user = userRepository.findById(request.id())
+ .orElseThrow(()-> new NoSuchElementException("해당 User가 존재하지 않습니다."));
+ user.update(
+ request.name(),
+ request.profileId(),
+ request.password()
+ );
+
+ userRepository.save(user);
+ return findById(request.id());
+ }
+
+ @Override
+ public void delete(UUID id) {
+ User user = userRepository.findById(id)
+ .orElseThrow(()-> new NoSuchElementException("해당 유저를 찾을 수 없습니다."));
+
+ UserStatus status = userStatusRepository.findByUserId(id)
+ .orElseThrow(()-> new NoSuchElementException("해당 User Status를 찾을 수 없습니다."));
+ userStatusRepository.delete(status.getId());
+
+ if (user.getProfileId() != null) {
+ binaryContentRepository.deleteById(user.getProfileId());
+ }
+ userRepository.deleteById(id);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/sprint/mission/discodeit/service/Impl/UserStatusServiceImpl.java b/src/main/java/com/sprint/mission/discodeit/service/Impl/UserStatusServiceImpl.java
new file mode 100644
index 00000000..1d35b2e7
--- /dev/null
+++ b/src/main/java/com/sprint/mission/discodeit/service/Impl/UserStatusServiceImpl.java
@@ -0,0 +1,87 @@
+package com.sprint.mission.discodeit.service.Impl;
+
+import com.sprint.mission.discodeit.dto.status.UserStatusCreateRequest;
+import com.sprint.mission.discodeit.dto.status.UserStatusResponse;
+import com.sprint.mission.discodeit.dto.status.UserStatusUpdateRequest;
+import com.sprint.mission.discodeit.entity.UserStatus;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.repository.UserStatusRepository;
+import com.sprint.mission.discodeit.service.UserStatusService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class UserStatusServiceImpl implements UserStatusService {
+ private final UserStatusRepository userStatusRepository;
+ private final UserRepository userRepository;
+
+ @Override
+ public UserStatusResponse create(UserStatusCreateRequest request) {
+ userRepository.findById(request.userId())
+ .orElseThrow(()-> new NoSuchElementException("존재하지 않는 유저입니다."));
+
+ if (userStatusRepository.findByUserId(request.userId()).isPresent()) {
+ throw new IllegalStateException("이미 해당 유저의 상태정보가 존재합니다.");
+ }
+
+ UserStatus status = new UserStatus(request.userId());
+ UserStatus savedStatus = userStatusRepository.save(status);
+
+ return convertToResponse(savedStatus);
+ }
+
+ public UserStatusResponse convertToResponse(UserStatus status) {
+ return new UserStatusResponse(
+ status.getId(),
+ status.getUserId()
+ );
+ }
+
+ @Override
+ public UserStatusResponse find(UUID id) {
+ UserStatus status = userStatusRepository.findById(id)
+ .orElseThrow(() -> new NoSuchElementException("해당 유저상태가 존재하지 않습니다."));
+ return convertToResponse(status);
+ }
+
+ @Override
+ public List findAll() {
+ List statuses = userStatusRepository.findAll();
+ if(statuses.isEmpty()) return Collections.emptyList();
+
+
+ return statuses.stream()
+ .map(this::convertToResponse)
+ .toList();
+ }
+
+ @Override
+ public UserStatusResponse update(UserStatusUpdateRequest request) {
+ UserStatus status = userStatusRepository.findById(request.id())
+ .orElseThrow(() -> new NoSuchElementException("상태 정보가 존재하지 않습니다"));
+ status.updateActiveTime();
+ return convertToResponse(status);
+ }
+
+ @Override
+ public UserStatusResponse updateByUserId(UUID userId, UserStatusUpdateRequest request) {
+ UserStatus status = userStatusRepository.findByUserId(userId)
+ .orElseThrow(() -> new NoSuchElementException("해당 유저에 대한 상태가 존재하지 않습니다"));
+ status.updateActiveTime();
+ return convertToResponse(status);
+ }
+
+ @Override
+ public void delete(UUID id) {
+ if (userStatusRepository.findById(id).isEmpty()) {
+ throw new NoSuchElementException("상태 정보가 존재하지 않습니다");
+ }
+ userStatusRepository.delete(id);
+ }
+}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
index cb47394e..7e817a38 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
@@ -1,23 +1,16 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest;
-import com.sprint.mission.discodeit.entity.Message;
+import com.sprint.mission.discodeit.dto.message.MessageCreateRequest;
+import com.sprint.mission.discodeit.dto.message.MessageResponse;
+import com.sprint.mission.discodeit.dto.message.MessageUpdateRequest;
import java.util.List;
import java.util.UUID;
public interface MessageService {
- Message create(MessageCreateRequest messageCreateRequest,
- List binaryContentCreateRequests);
-
- Message find(UUID messageId);
-
- List findAllByChannelId(UUID channelId);
-
- Message update(UUID messageId, MessageUpdateRequest request);
-
- void delete(UUID messageId);
+ MessageResponse create(MessageCreateRequest request);
+ List findByChannelId(UUID id);
+ MessageResponse update(MessageUpdateRequest request);
+ void delete(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java
index b0bd70c2..fb3d2b60 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java
@@ -1,21 +1,20 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest;
-import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest;
-import com.sprint.mission.discodeit.entity.ReadStatus;
+import com.sprint.mission.discodeit.dto.status.ReadStatusResponse;
+import com.sprint.mission.discodeit.dto.status.ReadStatusUpdateRequest;
+import com.sprint.mission.discodeit.dto.status.ReadStatuscreateRequest;
import java.util.List;
import java.util.UUID;
public interface ReadStatusService {
+ ReadStatusResponse create(ReadStatuscreateRequest request);
- ReadStatus create(ReadStatusCreateRequest request);
+ ReadStatusResponse find(UUID id);
- ReadStatus find(UUID readStatusId);
+ List findAllByUserId(UUID userId);
- List findAllByUserId(UUID userId);
+ ReadStatusResponse update(ReadStatusUpdateRequest request);
- ReadStatus update(UUID readStatusId, ReadStatusUpdateRequest request);
-
- void delete(UUID readStatusId);
+ void delete(UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java
index 6df78593..8b37f935 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java
@@ -1,26 +1,18 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.data.UserDto;
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserUpdateRequest;
-import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.dto.user.UserCreateRequest;
+import com.sprint.mission.discodeit.dto.user.UserResponse;
+import com.sprint.mission.discodeit.dto.user.UserUpdateRequest;
import java.util.List;
-import java.util.Optional;
import java.util.UUID;
public interface UserService {
- User create(UserCreateRequest userCreateRequest,
- Optional profileCreateRequest);
+ UserResponse create(UserCreateRequest request);
+ UserResponse findById(UUID id);
+ List findAll();
+ UserResponse update(UserUpdateRequest request);
+ void delete(UUID id);
- UserDto find(UUID userId);
-
- List findAll();
-
- User update(UUID userId, UserUpdateRequest userUpdateRequest,
- Optional profileCreateRequest);
-
- void delete(UUID userId);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java
index fbb37b0c..09f06f22 100644
--- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java
+++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java
@@ -1,23 +1,17 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.request.UserStatusCreateRequest;
-import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest;
-import com.sprint.mission.discodeit.entity.UserStatus;
+import com.sprint.mission.discodeit.dto.status.UserStatusCreateRequest;
+import com.sprint.mission.discodeit.dto.status.UserStatusResponse;
+import com.sprint.mission.discodeit.dto.status.UserStatusUpdateRequest;
import java.util.List;
import java.util.UUID;
public interface UserStatusService {
-
- UserStatus create(UserStatusCreateRequest request);
-
- UserStatus find(UUID userStatusId);
-
- List findAll();
-
- UserStatus update(UUID userStatusId, UserStatusUpdateRequest request);
-
- UserStatus updateByUserId(UUID userId, UserStatusUpdateRequest request);
-
- void delete(UUID userStatusId);
+ UserStatusResponse create (UserStatusCreateRequest request);
+ UserStatusResponse find (UUID id);
+ List findAll ();
+ UserStatusResponse update (UserStatusUpdateRequest request);
+ UserStatusResponse updateByUserId (UUID userId, UserStatusUpdateRequest request);
+ void delete (UUID id);
}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java
deleted file mode 100644
index 83b11596..00000000
--- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.request.LoginRequest;
-import com.sprint.mission.discodeit.entity.User;
-import com.sprint.mission.discodeit.repository.UserRepository;
-import com.sprint.mission.discodeit.service.AuthService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.NoSuchElementException;
-
-@RequiredArgsConstructor
-@Service
-public class BasicAuthService implements AuthService {
-
- private final UserRepository userRepository;
-
- @Override
- public User login(LoginRequest loginRequest) {
- String username = loginRequest.username();
- String password = loginRequest.password();
-
- User user = userRepository.findByUsername(username)
- .orElseThrow(
- () -> new NoSuchElementException("User with username " + username + " not found"));
-
- if (!user.getPassword().equals(password)) {
- throw new IllegalArgumentException("Wrong password");
- }
-
- return user;
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java
deleted file mode 100644
index 335b6d67..00000000
--- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.entity.BinaryContent;
-import com.sprint.mission.discodeit.repository.BinaryContentRepository;
-import com.sprint.mission.discodeit.service.BinaryContentService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@Service
-public class BasicBinaryContentService implements BinaryContentService {
-
- private final BinaryContentRepository binaryContentRepository;
-
- @Override
- public BinaryContent create(BinaryContentCreateRequest request) {
- String fileName = request.fileName();
- byte[] bytes = request.bytes();
- String contentType = request.contentType();
- BinaryContent binaryContent = new BinaryContent(
- fileName,
- (long) bytes.length,
- contentType,
- bytes
- );
- return binaryContentRepository.save(binaryContent);
- }
-
- @Override
- public BinaryContent find(UUID binaryContentId) {
- return binaryContentRepository.findById(binaryContentId)
- .orElseThrow(() -> new NoSuchElementException(
- "BinaryContent with id " + binaryContentId + " not found"));
- }
-
- @Override
- public List findAllByIdIn(List binaryContentIds) {
- return binaryContentRepository.findAllByIdIn(binaryContentIds).stream()
- .toList();
- }
-
- @Override
- public void delete(UUID binaryContentId) {
- if (!binaryContentRepository.existsById(binaryContentId)) {
- throw new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found");
- }
- binaryContentRepository.deleteById(binaryContentId);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java
deleted file mode 100644
index 54104b42..00000000
--- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.data.ChannelDto;
-import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest;
-import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest;
-import com.sprint.mission.discodeit.entity.Channel;
-import com.sprint.mission.discodeit.entity.ChannelType;
-import com.sprint.mission.discodeit.entity.Message;
-import com.sprint.mission.discodeit.entity.ReadStatus;
-import com.sprint.mission.discodeit.repository.ChannelRepository;
-import com.sprint.mission.discodeit.repository.MessageRepository;
-import com.sprint.mission.discodeit.repository.ReadStatusRepository;
-import com.sprint.mission.discodeit.service.ChannelService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.Instant;
-import java.util.*;
-
-@RequiredArgsConstructor
-@Service
-public class BasicChannelService implements ChannelService {
-
- private final ChannelRepository channelRepository;
- //
- private final ReadStatusRepository readStatusRepository;
- private final MessageRepository messageRepository;
-
- @Override
- public Channel create(PublicChannelCreateRequest request) {
- String name = request.name();
- String description = request.description();
- Channel channel = new Channel(ChannelType.PUBLIC, name, description);
-
- return channelRepository.save(channel);
- }
-
- @Override
- public Channel create(PrivateChannelCreateRequest request) {
- Channel channel = new Channel(ChannelType.PRIVATE, null, null);
- Channel createdChannel = channelRepository.save(channel);
-
- request.participantIds().stream()
- .map(userId -> new ReadStatus(userId, createdChannel.getId(), Instant.MIN))
- .forEach(readStatusRepository::save);
-
- return createdChannel;
- }
-
- @Override
- public ChannelDto find(UUID channelId) {
- return channelRepository.findById(channelId)
- .map(this::toDto)
- .orElseThrow(
- () -> new NoSuchElementException("Channel with id " + channelId + " not found"));
- }
-
- @Override
- public List findAllByUserId(UUID userId) {
- List mySubscribedChannelIds = readStatusRepository.findAllByUserId(userId).stream()
- .map(ReadStatus::getChannelId)
- .toList();
-
- return channelRepository.findAll().stream()
- .filter(channel ->
- channel.getType().equals(ChannelType.PUBLIC)
- || mySubscribedChannelIds.contains(channel.getId())
- )
- .map(this::toDto)
- .toList();
- }
-
- @Override
- public Channel update(UUID channelId, PublicChannelUpdateRequest request) {
- String newName = request.newName();
- String newDescription = request.newDescription();
- Channel channel = channelRepository.findById(channelId)
- .orElseThrow(
- () -> new NoSuchElementException("Channel with id " + channelId + " not found"));
- if (channel.getType().equals(ChannelType.PRIVATE)) {
- throw new IllegalArgumentException("Private channel cannot be updated");
- }
- channel.update(newName, newDescription);
- return channelRepository.save(channel);
- }
-
- @Override
- public void delete(UUID channelId) {
- Channel channel = channelRepository.findById(channelId)
- .orElseThrow(
- () -> new NoSuchElementException("Channel with id " + channelId + " not found"));
-
- messageRepository.deleteAllByChannelId(channel.getId());
- readStatusRepository.deleteAllByChannelId(channel.getId());
-
- channelRepository.deleteById(channelId);
- }
-
- private ChannelDto toDto(Channel channel) {
- Instant lastMessageAt = messageRepository.findAllByChannelId(channel.getId())
- .stream()
- .sorted(Comparator.comparing(Message::getCreatedAt).reversed())
- .map(Message::getCreatedAt)
- .limit(1)
- .findFirst()
- .orElse(Instant.MIN);
-
- List participantIds = new ArrayList<>();
- if (channel.getType().equals(ChannelType.PRIVATE)) {
- readStatusRepository.findAllByChannelId(channel.getId())
- .stream()
- .map(ReadStatus::getUserId)
- .forEach(participantIds::add);
- }
-
- return new ChannelDto(
- channel.getId(),
- channel.getType(),
- channel.getName(),
- channel.getDescription(),
- participantIds,
- lastMessageAt
- );
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java
deleted file mode 100644
index e6fab413..00000000
--- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageCreateRequest;
-import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest;
-import com.sprint.mission.discodeit.entity.BinaryContent;
-import com.sprint.mission.discodeit.entity.Message;
-import com.sprint.mission.discodeit.repository.BinaryContentRepository;
-import com.sprint.mission.discodeit.repository.ChannelRepository;
-import com.sprint.mission.discodeit.repository.MessageRepository;
-import com.sprint.mission.discodeit.repository.UserRepository;
-import com.sprint.mission.discodeit.service.MessageService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@Service
-public class BasicMessageService implements MessageService {
-
- private final MessageRepository messageRepository;
- //
- private final ChannelRepository channelRepository;
- private final UserRepository userRepository;
- private final BinaryContentRepository binaryContentRepository;
-
- @Override
- public Message create(MessageCreateRequest messageCreateRequest,
- List binaryContentCreateRequests) {
- UUID channelId = messageCreateRequest.channelId();
- UUID authorId = messageCreateRequest.authorId();
-
- if (!channelRepository.existsById(channelId)) {
- throw new NoSuchElementException("Channel with id " + channelId + " does not exist");
- }
- if (!userRepository.existsById(authorId)) {
- throw new NoSuchElementException("Author with id " + authorId + " does not exist");
- }
-
- List attachmentIds = binaryContentCreateRequests.stream()
- .map(attachmentRequest -> {
- String fileName = attachmentRequest.fileName();
- String contentType = attachmentRequest.contentType();
- byte[] bytes = attachmentRequest.bytes();
-
- BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length,
- contentType, bytes);
- BinaryContent createdBinaryContent = binaryContentRepository.save(binaryContent);
- return createdBinaryContent.getId();
- })
- .toList();
-
- String content = messageCreateRequest.content();
- Message message = new Message(
- content,
- channelId,
- authorId,
- attachmentIds
- );
- return messageRepository.save(message);
- }
-
- @Override
- public Message find(UUID messageId) {
- return messageRepository.findById(messageId)
- .orElseThrow(
- () -> new NoSuchElementException("Message with id " + messageId + " not found"));
- }
-
- @Override
- public List findAllByChannelId(UUID channelId) {
- return messageRepository.findAllByChannelId(channelId).stream()
- .toList();
- }
-
- @Override
- public Message update(UUID messageId, MessageUpdateRequest request) {
- String newContent = request.newContent();
- Message message = messageRepository.findById(messageId)
- .orElseThrow(
- () -> new NoSuchElementException("Message with id " + messageId + " not found"));
- message.update(newContent);
- return messageRepository.save(message);
- }
-
- @Override
- public void delete(UUID messageId) {
- Message message = messageRepository.findById(messageId)
- .orElseThrow(
- () -> new NoSuchElementException("Message with id " + messageId + " not found"));
-
- message.getAttachmentIds()
- .forEach(binaryContentRepository::deleteById);
-
- messageRepository.deleteById(messageId);
- }
-}
diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java
deleted file mode 100644
index 8dc4fea9..00000000
--- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest;
-import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest;
-import com.sprint.mission.discodeit.entity.ReadStatus;
-import com.sprint.mission.discodeit.repository.ChannelRepository;
-import com.sprint.mission.discodeit.repository.ReadStatusRepository;
-import com.sprint.mission.discodeit.repository.UserRepository;
-import com.sprint.mission.discodeit.service.ReadStatusService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.Instant;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-
-@RequiredArgsConstructor
-@Service
-public class BasicReadStatusService implements ReadStatusService {
-
- private final ReadStatusRepository readStatusRepository;
- private final UserRepository userRepository;
- private final ChannelRepository channelRepository;
-
- @Override
- public ReadStatus create(ReadStatusCreateRequest request) {
- UUID userId = request.userId();
- UUID channelId = request.channelId();
-
- if (!userRepository.existsById(userId)) {
- throw new NoSuchElementException("User with id " + userId + " does not exist");
- }
- if (!channelRepository.existsById(channelId)) {
- throw new NoSuchElementException("Channel with id " + channelId + " does not exist");
- }
-
- return readStatusRepository.findAllByUserId(userId).stream()
- .filter(readStatus -> readStatus.getChannelId().equals(channelId))
- .findFirst()
- .orElseGet(
- () -> {
- Instant lastReadAt = request.lastReadAt();
- ReadStatus readStatus = new ReadStatus(userId, channelId, lastReadAt);
- return readStatusRepository.save(readStatus);
- }
- );
- }
-
- @Override
- public ReadStatus find(UUID readStatusId) {
- return readStatusRepository.findById(readStatusId)
- .orElseThrow(
- () -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found"));
- }
-
- @Override
- public List