diff --git a/.github/PR_SPRINT_3.md b/.github/PR_SPRINT_3.md
deleted file mode 100644
index 1eb1c83e..00000000
--- a/.github/PR_SPRINT_3.md
+++ /dev/null
@@ -1,38 +0,0 @@
-
-## 요구사항
-
-### 기본
-- [x] 기본 항목 1
-- [x] 기본 항목 2
-
-### 심화
-- [x] 심화 항목 1
-- [x] 심화 항목 2
-
-## 기본 구조
-*
-
-## 주요 변경사항
-*
-
-## Spring 개념 이해
-JavaApplication과 DiscodeitApplication에서
-Service를 초기화하는 방식의 차이에 대해 다음 키워드를 중심으로 정리.
-
-**키워드: IoC Container, Dependency Injection, Bean**
-
-### JavaApplication의 Service 초기화 방식
-현재 JavaApplication에서는, 서비스를 생성자로 새롭게 생성하기 전에,
-
-레포지토리들을 먼저 생성자로 모두 생성한 후, 서비스 생성자에 직접 매개변수로 입력해주는 방식으로 초기화를 진행하고 있다.
-
-
-### DiscodeitApplication의 Service 초기화 방식
-
-
-## 스크린샷
-
-
-## 멘토에게
--
--
\ No newline at end of file
diff --git a/.github/PR_SPRINT_4.md b/.github/PR_SPRINT_4.md
new file mode 100644
index 00000000..2c9df89d
--- /dev/null
+++ b/.github/PR_SPRINT_4.md
@@ -0,0 +1,17 @@
+
+## 요구사항
+
+### 기본
+- [x] 기본 항목 1
+- [x] 기본 항목 2
+
+### 심화
+- [x] 심화 항목 1
+- [x] 심화 항목 2
+
+
+## 주요 변경사항
+- controller를 통해 postman과 작동 확인
+- postman의 컬렉션 정보 json형식으로 export하여 .github 폴더에 추가하여 두었습니다.
+- 예외를 GlobalExceptionHandler로 처리해보았습니다.
+
diff --git a/.github/sprint-mission-4.postman_collection.json b/.github/sprint-mission-4.postman_collection.json
new file mode 100644
index 00000000..d858ff97
--- /dev/null
+++ b/.github/sprint-mission-4.postman_collection.json
@@ -0,0 +1,581 @@
+{
+ "info": {
+ "_postman_id": "50209e81-74b0-4eab-afd7-f7aedc35dd0a",
+ "name": "sprint-mission-4",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
+ "_exporter_id": "52123480",
+ "_collection_link": "https://go.postman.co/collection/52123480-50209e81-74b0-4eab-afd7-f7aedc35dd0a?source=collection_link"
+ },
+ "item": [
+ {
+ "name": "user",
+ "item": [
+ {
+ "name": "create",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "userCreateReqDto",
+ "value": "{\"username\": \"kkk\",\n\"email\": \"kkk@codeit.com\",\n\"password\": \"admin\"}",
+ "type": "text",
+ "uuid": "a508c30b-d515-41d2-bdb2-6bac10ee0296",
+ "contentType": "application/json"
+ },
+ {
+ "key": "profile",
+ "type": "file",
+ "uuid": "6f43a7b0-271a-4955-bc21-ec3e5ab5401b",
+ "src": "/C:/Users/ASUS/Desktop/잡다/그림/짤/HANWZHgaAAEHVa5.jpg"
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/api/user/create",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "user",
+ "create"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "edit",
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "userUpdateReqDto",
+ "value": "{\"username\":\"master\",\n\"email\":\"master@codeit.com\",\n\"password\":\"master\"}",
+ "type": "text",
+ "uuid": "0a0a75f0-b33e-4230-95d6-ef4c8bd27a93",
+ "contentType": "application/json"
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/api/user/edit/a913fde7-2147-4d73-8dba-3fc975e9120e",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "user",
+ "edit",
+ "a913fde7-2147-4d73-8dba-3fc975e9120e"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "delete",
+ "request": {
+ "method": "DELETE",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/user/delete/68e277c5-22c0-4126-9818-a6841949ab16sdf",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "user",
+ "delete",
+ "68e277c5-22c0-4126-9818-a6841949ab16sdf"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "list",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/user/findAll",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "user",
+ "findAll"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "channel",
+ "item": [
+ {
+ "name": "publicCreate",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"name\" : \"publicChannel\",\r\n \"description\": \"This is public channel\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/channel/public/create",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "channel",
+ "public",
+ "create"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "privateCreate",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"participantIds\" : [\"8244f4ee-c584-4980-8427-127806b7fca3\",\"a913fde7-2147-4d73-8dba-3fc975e9120e\"],\r\n \"name\" : \"privateChannel\",\r\n \"description\" : \"This is private channel\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/channel/private/create",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "channel",
+ "private",
+ "create"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "publicEdit",
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"newName\" : \"publicChannel\",\r\n \"newDescription\" : \"This is public channel\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/channel/public/edit/773e89da-b8fa-4dda-8aac-6594bfc0369c",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "channel",
+ "public",
+ "edit",
+ "773e89da-b8fa-4dda-8aac-6594bfc0369c"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "delete",
+ "request": {
+ "method": "DELETE",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "userCreateReqDto",
+ "value": "{\"username\": \"admin\",\n\"email\": \"admin@codeit.com\",\n\"password\": \"master\"}",
+ "type": "text",
+ "uuid": "a508c30b-d515-41d2-bdb2-6bac10ee0296",
+ "contentType": "application/json"
+ },
+ {
+ "key": "profile",
+ "type": "file",
+ "uuid": "6f43a7b0-271a-4955-bc21-ec3e5ab5401b",
+ "src": "/C:/Users/ASUS/Desktop/dev/web/codeit_sprint_bootcamp/icon.png"
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/api/channel/delete/f9a91514-74d4-4864-9f88-a18283715bc8",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "channel",
+ "delete",
+ "f9a91514-74d4-4864-9f88-a18283715bc8"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "list",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/channel/list/a913fde7-2147-4d73-8dba-3fc975e9120e",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "channel",
+ "list",
+ "a913fde7-2147-4d73-8dba-3fc975e9120e"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "message",
+ "item": [
+ {
+ "name": "create",
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "messageCreateReqDto",
+ "value": "{\"content\": \"gg\",\n\"channelId\": \"773e89da-b8fa-4dda-8aac-6594bfc0369c\",\n\"authorId\": \"47d171eb-0339-4d27-a10b-0b2c569da996\"}",
+ "type": "text",
+ "uuid": "a508c30b-d515-41d2-bdb2-6bac10ee0296",
+ "contentType": "application/json"
+ },
+ {
+ "key": "files",
+ "type": "file",
+ "uuid": "6f43a7b0-271a-4955-bc21-ec3e5ab5401b",
+ "value": null
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/api/message/create",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "message",
+ "create"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "edit",
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"newContent\" : \"guest\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/message/edit/764dc6bd-dc77-4175-b5db-6f7a19d15b72",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "message",
+ "edit",
+ "764dc6bd-dc77-4175-b5db-6f7a19d15b72"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "delete",
+ "request": {
+ "method": "DELETE",
+ "header": [],
+ "body": {
+ "mode": "formdata",
+ "formdata": [
+ {
+ "key": "userCreateReqDto",
+ "value": "{\"username\": \"admin\",\n\"email\": \"admin@codeit.com\",\n\"password\": \"master\"}",
+ "type": "text",
+ "uuid": "a508c30b-d515-41d2-bdb2-6bac10ee0296",
+ "contentType": "application/json"
+ },
+ {
+ "key": "profile",
+ "type": "file",
+ "uuid": "6f43a7b0-271a-4955-bc21-ec3e5ab5401b",
+ "src": "/C:/Users/ASUS/Desktop/dev/web/codeit_sprint_bootcamp/icon.png"
+ }
+ ]
+ },
+ "url": {
+ "raw": "{{base_url}}/api/message/delete/21d31209-a335-4773-be70-af6620ac36ff",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "message",
+ "delete",
+ "21d31209-a335-4773-be70-af6620ac36ff"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "list",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/message/list/773e89da-b8fa-4dda-8aac-6594bfc0369c",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "message",
+ "list",
+ "773e89da-b8fa-4dda-8aac-6594bfc0369c"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "readStatus",
+ "item": [
+ {
+ "name": "create",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const currentTime = new Date().toISOString();\r",
+ "pm.variables.set(\"current_timestamp\", currentTime);"
+ ],
+ "type": "text/javascript",
+ "packages": {},
+ "requests": {}
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"channelId\": \"773e89da-b8fa-4dda-8aac-6594bfc0369c\",\r\n \"userId\": \"a913fde7-2147-4d73-8dba-3fc975e9120e\",\r\n \"lastReadAt\": \"{{current_timestamp}}\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/readStatus/create",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "readStatus",
+ "create"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "edit",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "const currentTime = new Date().toISOString();\r",
+ "pm.variables.set(\"current_timestamp\", currentTime);"
+ ],
+ "type": "text/javascript",
+ "packages": {},
+ "requests": {}
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"newLastReadAt\" : \"{{current_timestamp}}\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{base_url}}/api/readStatus/edit/daff9bdb-ded8-4145-b77a-52c36ada4684",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "readStatus",
+ "edit",
+ "daff9bdb-ded8-4145-b77a-52c36ada4684"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "list",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/readStatus/list/a913fde7-2147-4d73-8dba-3fc975e9120e",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "readStatus",
+ "list",
+ "a913fde7-2147-4d73-8dba-3fc975e9120e"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "others",
+ "item": [
+ {
+ "name": "auth",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/auth/login?username=master&password=master",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "auth",
+ "login"
+ ],
+ "query": [
+ {
+ "key": "username",
+ "value": "master"
+ },
+ {
+ "key": "password",
+ "value": "master"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "binaryContent/findAll",
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{base_url}}/api/binaryContent/findAll?fileIdList=b841bbcb-bf86-4807-a01d-89ef8d0e0c35, 13d608a1-01b3-43b7-95b0-8d4dda640ea2",
+ "host": [
+ "{{base_url}}"
+ ],
+ "path": [
+ "api",
+ "binaryContent",
+ "findAll"
+ ],
+ "query": [
+ {
+ "key": "fileIdList",
+ "value": "b841bbcb-bf86-4807-a01d-89ef8d0e0c35, 13d608a1-01b3-43b7-95b0-8d4dda640ea2"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "binaryContent/find",
+ "request": {
+ "method": "GET",
+ "header": []
+ },
+ "response": []
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0537c224..bd2e6e06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
-
+**/file-data-map/
+**/.discodeit/
+**/.gradle/
.idea
diff --git a/discodeit/.gitignore b/discodeit/.gitignore
index c2065bc2..0005e4f7 100644
--- a/discodeit/.gitignore
+++ b/discodeit/.gitignore
@@ -1,5 +1,6 @@
HELP.md
.gradle
+.gradle/
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
diff --git a/discodeit/.gradle/9.0.0/checksums/checksums.lock b/discodeit/.gradle/9.0.0/checksums/checksums.lock
deleted file mode 100644
index bb58ad43..00000000
Binary files a/discodeit/.gradle/9.0.0/checksums/checksums.lock and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/executionHistory/executionHistory.bin b/discodeit/.gradle/9.0.0/executionHistory/executionHistory.bin
deleted file mode 100644
index 6a65ec2d..00000000
Binary files a/discodeit/.gradle/9.0.0/executionHistory/executionHistory.bin and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/executionHistory/executionHistory.lock b/discodeit/.gradle/9.0.0/executionHistory/executionHistory.lock
deleted file mode 100644
index 580d6cc2..00000000
Binary files a/discodeit/.gradle/9.0.0/executionHistory/executionHistory.lock and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/fileChanges/last-build.bin b/discodeit/.gradle/9.0.0/fileChanges/last-build.bin
deleted file mode 100644
index f76dd238..00000000
Binary files a/discodeit/.gradle/9.0.0/fileChanges/last-build.bin and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/fileHashes/fileHashes.bin b/discodeit/.gradle/9.0.0/fileHashes/fileHashes.bin
deleted file mode 100644
index f9c4e420..00000000
Binary files a/discodeit/.gradle/9.0.0/fileHashes/fileHashes.bin and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/fileHashes/fileHashes.lock b/discodeit/.gradle/9.0.0/fileHashes/fileHashes.lock
deleted file mode 100644
index 97186b6a..00000000
Binary files a/discodeit/.gradle/9.0.0/fileHashes/fileHashes.lock and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/fileHashes/resourceHashesCache.bin b/discodeit/.gradle/9.0.0/fileHashes/resourceHashesCache.bin
deleted file mode 100644
index fe0cec20..00000000
Binary files a/discodeit/.gradle/9.0.0/fileHashes/resourceHashesCache.bin and /dev/null differ
diff --git a/discodeit/.gradle/9.0.0/gc.properties b/discodeit/.gradle/9.0.0/gc.properties
deleted file mode 100644
index e69de29b..00000000
diff --git a/discodeit/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/discodeit/.gradle/buildOutputCleanup/buildOutputCleanup.lock
deleted file mode 100644
index c981c7c1..00000000
Binary files a/discodeit/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ
diff --git a/discodeit/.gradle/buildOutputCleanup/cache.properties b/discodeit/.gradle/buildOutputCleanup/cache.properties
deleted file mode 100644
index 278d5805..00000000
--- a/discodeit/.gradle/buildOutputCleanup/cache.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#Tue Jan 27 16:17:23 KST 2026
-gradle.version=8.14.4
diff --git a/discodeit/.gradle/buildOutputCleanup/outputFiles.bin b/discodeit/.gradle/buildOutputCleanup/outputFiles.bin
deleted file mode 100644
index 3d882c42..00000000
Binary files a/discodeit/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ
diff --git a/discodeit/.gradle/file-system.probe b/discodeit/.gradle/file-system.probe
deleted file mode 100644
index 647580fb..00000000
Binary files a/discodeit/.gradle/file-system.probe and /dev/null differ
diff --git a/discodeit/.gradle/vcs-1/gc.properties b/discodeit/.gradle/vcs-1/gc.properties
deleted file mode 100644
index e69de29b..00000000
diff --git a/discodeit/build/reports/problems/problems-report.html b/discodeit/build/reports/problems/problems-report.html
deleted file mode 100644
index b723588f..00000000
--- a/discodeit/build/reports/problems/problems-report.html
+++ /dev/null
@@ -1,663 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- Gradle Configuration Cache
-
-
-
-
-
-
- Loading...
-
-
-
-
-
-
-
diff --git a/discodeit/build/tmp/compileJava/previous-compilation-data.bin b/discodeit/build/tmp/compileJava/previous-compilation-data.bin
deleted file mode 100644
index 74252592..00000000
Binary files a/discodeit/build/tmp/compileJava/previous-compilation-data.bin and /dev/null differ
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/discodeit/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
index 15e2174e..a0dcddbc 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java
@@ -1,8 +1,6 @@
package com.sprint.mission.discodeit;
-import com.sprint.mission.discodeit.dto.MessageCreateDto;
-import com.sprint.mission.discodeit.dto.PublicChannelDto;
-import com.sprint.mission.discodeit.dto.UseCreaterDto;
+import com.sprint.mission.discodeit.dto.*;
import com.sprint.mission.discodeit.entity.Channel;
import com.sprint.mission.discodeit.entity.ChannelType;
import com.sprint.mission.discodeit.entity.Message;
@@ -14,43 +12,15 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
@SpringBootApplication
public class DiscodeitApplication {
- static User setupUser(UserService userService) {
- UseCreaterDto useCreaterDto = new UseCreaterDto("woody", "woody@codeit.com", "woody1234", null);
- return userService.create(useCreaterDto);
- }
-
- static Channel setupChannel(ChannelService channelService) {
- PublicChannelDto publicChannelDto = new PublicChannelDto(ChannelType.PUBLIC, "notice", "This is notice channel.");
- return channelService.createPublicChannel(publicChannelDto);
- }
-
- static void messageCreateTest(MessageService messageService, Channel channel, User author) {
- MessageCreateDto messageCreateDto = new MessageCreateDto("Hello World", channel.getId(), author.getId(), null);
- Message message = messageService.create(messageCreateDto);
- System.out.println("Message created: " + message.getId());
- }
-
public static void main(String[] args) {
- ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args);
-
- // 서비스 초기화
- UserService userService;
- ChannelService channelService;
- MessageService messageService;
-
- // TODO context에서 Bean을 조회하여 각 서비스 구현테 할당 코드 작성하기
- userService = context.getBean(UserService.class);
- channelService = context.getBean(ChannelService.class);
- messageService = context.getBean(MessageService.class);
-
- // 셋업
- User user = setupUser(userService);
- Channel channel = setupChannel(channelService);
- // 테스트
- messageCreateTest(messageService, channel, user);
+ SpringApplication.run(DiscodeitApplication.class, args);
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/discodeit/src/main/java/com/sprint/mission/discodeit/JavaApplication.java
deleted file mode 100644
index 45ead0ae..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/JavaApplication.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.sprint.mission.discodeit;
-
-import com.sprint.mission.discodeit.dto.*;
-import com.sprint.mission.discodeit.entity.*;
-import com.sprint.mission.discodeit.repository.*;
-import com.sprint.mission.discodeit.repository.file.*;
-import com.sprint.mission.discodeit.service.ChannelService;
-import com.sprint.mission.discodeit.service.MessageService;
-import com.sprint.mission.discodeit.service.UserService;
-import com.sprint.mission.discodeit.service.basic.BasicChannelService;
-import com.sprint.mission.discodeit.service.basic.BasicMessageService;
-import com.sprint.mission.discodeit.service.basic.BasicUserService;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-public class JavaApplication {
- static User setupUser(UserService userService) {
- BinaryContentCreateDto file = new BinaryContentCreateDto("file","txt",40L);
- UseCreaterDto useCreaterDto = new UseCreaterDto("woody", "woody@codeit.com", "woody1234", file);
- return userService.create(useCreaterDto);
- }
-
- static Channel setupPublicChannel(ChannelService channelService) {
- PublicChannelDto publicChannelDto = new PublicChannelDto(ChannelType.PUBLIC, "notice", "This is notice channel.");
- return channelService.createPublicChannel(publicChannelDto);
- }
-
- static Channel setupPrivateChannel(ChannelService channelService, List userIdList) {
- PrivateChannelDto privateChannelDto = new PrivateChannelDto(ChannelType.PRIVATE, userIdList);
- return channelService.createPrivateChannel(privateChannelDto);
- }
-
- static void messageCreateTest(MessageService messageService, Channel channel, User author) {
- MessageCreateDto messageCreateDto = new MessageCreateDto("Hello World", channel.getId(), author.getId(), null);
- Message message = messageService.create(messageCreateDto);
- System.out.println("Message created: " + message.getId());
- }
-
- public static void main(String[] args) {
- // 레포지토리 초기화
- UserRepository userRepository = new FileUserRepository();
- ChannelRepository channelRepository = new FileChannelRepository();
- MessageRepository messageRepository = new FileMessageRepository();
- BinaryContentRepository binaryContentRepository = new FileBinaryContentRepository();
- ReadStatusRepository readStatusRepository = new FileReadStatusRepository();
- UserStatusRepository userStatusRepository = new FileUserStatusRepository();
-
- // 서비스 초기화
- UserService userService = new BasicUserService(userRepository, userStatusRepository, binaryContentRepository);
- ChannelService channelService = new BasicChannelService(channelRepository,readStatusRepository, messageRepository);
- MessageService messageService = new BasicMessageService(messageRepository, channelRepository, userRepository, binaryContentRepository);
-
- // 셋업
- User user = setupUser(userService);
-
- List userList = new ArrayList<>();
- userList.add(user);
- List userIdList = userList.stream()
- .map(User::getId).toList();
- Channel publicChannel = setupPublicChannel(channelService);
- Channel privateChannel = setupPrivateChannel(channelService, userIdList);
- // 테스트
- messageCreateTest(messageService, publicChannel, user);
- messageCreateTest(messageService, privateChannel, user);
- }
-}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java
new file mode 100644
index 00000000..8c09e120
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java
@@ -0,0 +1,26 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.dto.UserLoginReqDto;
+import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.service.AuthService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+@Controller
+@RequestMapping("/api/auth")
+@RequiredArgsConstructor
+public class AuthController {
+ private final AuthService authService;
+
+ @GetMapping("/login")
+ public ResponseEntity> login(
+ @RequestParam String username,
+ @RequestParam String password
+ ){
+ UserLoginReqDto dto = new UserLoginReqDto(username, password);
+ User user = authService.login(dto);
+ return ResponseEntity.ok(user);
+ }
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java
new file mode 100644
index 00000000..ff3b6939
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java
@@ -0,0 +1,38 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.entity.BinaryContent;
+import com.sprint.mission.discodeit.service.BinaryContentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@Controller
+@RequestMapping("/api/binaryContent")
+@RequiredArgsConstructor
+public class BinaryContentController {
+ private final BinaryContentService binaryContentService;
+
+ @GetMapping("/findAll")
+ public ResponseEntity> viewFiles(
+ @RequestParam List fileIdList
+ ){
+ List fileList = binaryContentService.findAllByIdIn(fileIdList);
+ return ResponseEntity.ok(fileList);
+ }
+
+ @GetMapping("/find")
+ public ResponseEntity viewFile(
+ @RequestParam UUID binaryContentId
+ ){
+ BinaryContent file = binaryContentService.find(binaryContentId);
+ return ResponseEntity.ok(file);
+ }
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java
new file mode 100644
index 00000000..b50aa12e
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java
@@ -0,0 +1,65 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.dto.PrivateChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.ChannelDto;
+import com.sprint.mission.discodeit.entity.Channel;
+import com.sprint.mission.discodeit.service.ChannelService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+@Controller
+@RequestMapping("/api/channel")
+@RequiredArgsConstructor
+public class ChannelController {
+ private final ChannelService channelService;
+
+ @PostMapping("/public/create")
+ public ResponseEntity> publicCreate(@RequestBody PublicChannelCreateReqDto dto){
+ Channel channel = channelService.create(dto);
+ ChannelDto result = channelService.find(channel.getId());
+ return ResponseEntity.ok(result);
+ }
+
+ @PostMapping("/private/create")
+ public ResponseEntity> privateCreate(@RequestBody PrivateChannelCreateReqDto dto){
+ Channel channel = channelService.create(dto);
+ ChannelDto result = channelService.find(channel.getId());
+ return ResponseEntity.ok(result);
+ }
+
+ @PatchMapping("/public/edit/{channelId}")
+ public ResponseEntity> edit(
+ @PathVariable UUID channelId,
+ @RequestBody PublicChannelUpdateReqDto dto
+ ){
+ channelService.update(channelId, dto);
+ ChannelDto result = channelService.find(channelId);
+ return ResponseEntity.ok(result);
+ }
+
+ @DeleteMapping("/delete/{channelId}")
+ public ResponseEntity> delete(
+ @PathVariable UUID channelId
+ ){
+ channelService.delete(channelId);
+ return ResponseEntity.ok("channel: " + channelId + "가 삭제되었습니다.");
+
+ }
+
+ @GetMapping("/list/{userId}")
+ public ResponseEntity> channelList(
+ @PathVariable UUID userId
+ ){
+ List channelList = channelService.findAllByUserId(userId);
+ return ResponseEntity.ok(channelList);
+ }
+
+
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/GlobalExceptionHandler.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/GlobalExceptionHandler.java
new file mode 100644
index 00000000..dbdd6ed3
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/GlobalExceptionHandler.java
@@ -0,0 +1,34 @@
+package com.sprint.mission.discodeit.controller;
+
+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/discodeit/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java
new file mode 100644
index 00000000..f9191810
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java
@@ -0,0 +1,72 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageUpdateReqDto;
+import com.sprint.mission.discodeit.dto.UserCreateReqDto;
+import com.sprint.mission.discodeit.entity.Message;
+import com.sprint.mission.discodeit.service.MessageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+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.UUID;
+
+@Controller
+@RequestMapping("/api/message")
+@RequiredArgsConstructor
+public class MessageController {
+ private final MessageService messageService;
+
+ @PostMapping(
+ path = "/create",
+ consumes = MediaType.MULTIPART_FORM_DATA_VALUE
+ )
+ public ResponseEntity> create(
+ @RequestPart("messageCreateReqDto") MessageCreateReqDto messageCreateReqDto,
+ @RequestPart("files") List files
+ ){
+ List binaryDtos = new ArrayList<>();
+ try {
+ for(MultipartFile file: files){
+ BinaryContentCreateReqDto data = new BinaryContentCreateReqDto(file.getName(), file.getContentType(), file.getBytes());
+ binaryDtos.add(data);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("파일을 읽을 수 없습니다.");
+ }
+ Message message = messageService.create(messageCreateReqDto, binaryDtos);
+ return ResponseEntity.ok(message);
+ }
+
+ @PatchMapping("/edit/{messageId}")
+ public ResponseEntity> edit(
+ @PathVariable UUID messageId,
+ @RequestBody MessageUpdateReqDto dto
+ ){
+ Message message = messageService.update(messageId,dto);
+ return ResponseEntity.ok(message);
+ }
+
+ @DeleteMapping("/delete/{messageId}")
+ public ResponseEntity> delete(
+ @PathVariable UUID messageId
+ ){
+ messageService.delete(messageId);
+ return ResponseEntity.ok("message: " + messageId + "가 삭제되었습니다.");
+ }
+
+ @GetMapping("/list/{channelId}")
+ public ResponseEntity> messageList(
+ @PathVariable UUID channelId
+ ){
+ List messages = messageService.findAllByChannelId(channelId);
+ return ResponseEntity.ok(messages);
+ }
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java
new file mode 100644
index 00000000..bd9c257c
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java
@@ -0,0 +1,43 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.dto.ReadStatusCreateReqDto;
+import com.sprint.mission.discodeit.dto.ReadStatusUpdateReqDto;
+import com.sprint.mission.discodeit.entity.ReadStatus;
+import com.sprint.mission.discodeit.service.ReadStatusService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+@Controller
+@RequestMapping("/api/readStatus")
+@RequiredArgsConstructor
+public class ReadStatusController {
+ private final ReadStatusService readStatusService;
+
+ @PostMapping("/create")
+ public ResponseEntity> create(@RequestBody ReadStatusCreateReqDto dto){
+ ReadStatus readStatus = readStatusService.create(dto);
+ return ResponseEntity.ok(readStatus);
+ }
+
+ @PatchMapping("/edit/{statusId}")
+ public ResponseEntity> edit(
+ @PathVariable UUID statusId,
+ @RequestBody ReadStatusUpdateReqDto dto
+ ){
+ ReadStatus readStatus = readStatusService.update(statusId, dto);
+ return ResponseEntity.ok(readStatus);
+ }
+
+ @GetMapping("/list/{userId}")
+ public ResponseEntity> statusList(
+ @PathVariable UUID userId
+ ){
+ List statusList = readStatusService.findAllByUserId(userId);
+ return ResponseEntity.ok(statusList);
+ }
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/UserController.java
new file mode 100644
index 00000000..d3aa5677
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/controller/UserController.java
@@ -0,0 +1,106 @@
+package com.sprint.mission.discodeit.controller;
+
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserStatusUpdateReqDto;
+import com.sprint.mission.discodeit.dto.UserUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.UserDto;
+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.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+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;
+
+@Controller
+@RequestMapping("/api/user")
+@RequiredArgsConstructor
+public class UserController {
+ private final UserService userService;
+ private final UserStatusService userStatusService;
+
+ @PostMapping(
+ path = "/create",
+ consumes = MediaType.MULTIPART_FORM_DATA_VALUE
+ )
+ public ResponseEntity> create(
+ @RequestPart("userCreateReqDto") UserCreateReqDto userCreateReqDto,
+ @RequestPart(value = "profile", required = false) MultipartFile profile
+ ){
+ Optional binaryDto = Optional.ofNullable(profile)
+ .filter(file -> !file.isEmpty())
+ .map(file -> {
+ try {
+ return new BinaryContentCreateReqDto(
+ file.getOriginalFilename(),
+ file.getContentType(),
+ file.getBytes()
+ );
+ } catch (IOException e) {
+ throw new RuntimeException("프로필 파일을 읽을 수 없습니다.", e);
+ }
+ });
+ User user = userService.create(userCreateReqDto, binaryDto);
+ UserDto result = userService.find(user.getId());
+ return ResponseEntity.ok(result);
+ }
+
+ @PatchMapping(
+ path = "/edit/{userId}",
+ consumes = MediaType.MULTIPART_FORM_DATA_VALUE
+ )
+ public ResponseEntity> edit(
+ @PathVariable UUID userId,
+ @RequestPart("userUpdateReqDto") UserUpdateReqDto userDto,
+ @RequestPart(value = "profile", required = false) MultipartFile profile
+ ){
+ Optional binaryDto = Optional.ofNullable(profile)
+ .filter(file -> !file.isEmpty())
+ .map(file -> {
+ try {
+ return new BinaryContentCreateReqDto(
+ file.getOriginalFilename(),
+ file.getContentType(),
+ file.getBytes()
+ );
+ } catch (IOException e) {
+ throw new RuntimeException("프로필 파일을 읽을 수 없습니다.", e);
+ }
+ });
+ userService.update(userId, userDto, binaryDto);
+ UserDto result = userService.find(userId);
+ return ResponseEntity.ok(result);
+ }
+
+ @DeleteMapping("/delete/{userId}")
+ public ResponseEntity> delete(
+ @PathVariable UUID userId
+ ){
+ userService.delete(userId);
+ return ResponseEntity.ok("user: " + userId + "가 삭제되었습니다.");
+ }
+
+ @GetMapping("/findAll")
+ public ResponseEntity> userList(){
+ List allUsers = userService.findAll();
+ return ResponseEntity.ok(allUsers);
+ }
+
+ @PatchMapping("/update/{userId}")
+ public ResponseEntity> update(
+ @PathVariable UUID userId,
+ @RequestBody UserStatusUpdateReqDto dto
+ ){
+ UserStatus userStatus = userStatusService.updateByUserId(userId, dto);
+ return ResponseEntity.ok(userStatus);
+ }
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateReqDto.java
similarity index 62%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateReqDto.java
index 580860eb..9f5d4067 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/BinaryContentCreateReqDto.java
@@ -1,8 +1,8 @@
package com.sprint.mission.discodeit.dto;
-public record BinaryContentCreateDto(
+public record BinaryContentCreateReqDto(
String fileName,
String contentType,
- Long size
+ byte[] bytes
) {
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelFindResDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelFindResDto.java
deleted file mode 100644
index 117f1ca4..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelFindResDto.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-
-import com.sprint.mission.discodeit.entity.Channel;
-
-import java.time.Instant;
-import java.util.List;
-import java.util.UUID;
-
-public record ChannelFindResDto (
- Channel channel,
- Instant lastMessageTime,
- List userIdList
-){}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateReqDto.java
similarity index 56%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateReqDto.java
index df86c81a..70dcec95 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageCreateReqDto.java
@@ -5,8 +5,9 @@
import java.util.List;
import java.util.UUID;
-public record MessageCreateDto(
- String content, UUID channelId, UUID authorId,
- List files
+public record MessageCreateReqDto(
+ String content,
+ UUID channelId,
+ UUID authorId
)
{ }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateDto.java
deleted file mode 100644
index a14c2afc..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateDto.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import java.util.UUID;
-
-public record MessageUpdateDto(
- UUID messageId, String newContent
-) {
-}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateReqDto.java
new file mode 100644
index 00000000..50980081
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/MessageUpdateReqDto.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto;
+
+
+public record MessageUpdateReqDto(
+ String newContent
+) {
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateReqDto.java
new file mode 100644
index 00000000..752d8360
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelCreateReqDto.java
@@ -0,0 +1,10 @@
+package com.sprint.mission.discodeit.dto;
+
+import java.util.List;
+import java.util.UUID;
+
+public record PrivateChannelCreateReqDto(
+ List participantIds,
+ String name,
+ String description
+) {}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelDto.java
deleted file mode 100644
index cbb794c1..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelDto.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import com.sprint.mission.discodeit.entity.ChannelType;
-
-import java.util.List;
-import java.util.UUID;
-
-public record PrivateChannelDto (
- ChannelType type,
- List userIdList
-){}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateReqDto.java
new file mode 100644
index 00000000..fe874d7b
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelCreateReqDto.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto;
+
+public record PublicChannelCreateReqDto(
+ String name,
+ String description
+) {
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelDto.java
deleted file mode 100644
index f29a9d44..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelDto.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import com.sprint.mission.discodeit.entity.ChannelType;
-
-public record PublicChannelDto (
- ChannelType type,
- String name,
- String description
-){}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelUpdateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelUpdateReqDto.java
similarity index 56%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelUpdateDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelUpdateReqDto.java
index 022d91a3..a2bb4cc0 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ChannelUpdateDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelUpdateReqDto.java
@@ -1,9 +1,6 @@
package com.sprint.mission.discodeit.dto;
-import java.util.UUID;
-
-public record ChannelUpdateDto(
- UUID channelId,
+public record PublicChannelUpdateReqDto(
String newName,
String newDescription
) {
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDto.java
deleted file mode 100644
index 8c274521..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateDto.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import com.sprint.mission.discodeit.entity.Channel;
-import com.sprint.mission.discodeit.entity.User;
-
-import java.util.UUID;
-
-public record ReadStatusCreateDto(
- UUID channelId,
- UUID userId
-) {
-}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateReqDto.java
new file mode 100644
index 00000000..32408259
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusCreateReqDto.java
@@ -0,0 +1,11 @@
+package com.sprint.mission.discodeit.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public record ReadStatusCreateReqDto(
+ UUID channelId,
+ UUID userId,
+ Instant lastReadAt
+) {
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDto.java
deleted file mode 100644
index e3bde4c4..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateDto.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import java.util.UUID;
-
-public record ReadStatusUpdateDto(
- UUID id,
- boolean isRead
-) { }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateReqDto.java
new file mode 100644
index 00000000..e5b4c944
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/ReadStatusUpdateReqDto.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto;
+
+import java.time.Instant;
+
+public record ReadStatusUpdateReqDto(
+ Instant newLastReadAt
+) { }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UseCreaterDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UseCreaterDto.java
deleted file mode 100644
index b3dd6403..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UseCreaterDto.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import com.sprint.mission.discodeit.entity.BinaryContent;
-
-public record UseCreaterDto(
- String username,
- String email,
- String password,
- BinaryContentCreateDto profile
-){}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserFindResDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserCreateReqDto.java
similarity index 61%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserFindResDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserCreateReqDto.java
index c624378c..3e1d6bb5 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserFindResDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserCreateReqDto.java
@@ -1,7 +1,7 @@
package com.sprint.mission.discodeit.dto;
-public record UserFindResDto(
+public record UserCreateReqDto(
String username,
String email,
- boolean onlineStatus
+ String password
){}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginReqDto.java
similarity index 75%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginReqDto.java
index 061962f7..a435de72 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserLoginReqDto.java
@@ -1,6 +1,6 @@
package com.sprint.mission.discodeit.dto;
-public record UserLoginDto(
+public record UserLoginReqDto(
String username,
String password
) {
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateDto.java
deleted file mode 100644
index 5daf6adc..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateDto.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import java.util.UUID;
-
-public record UserStatusCreateDto(
- UUID userId
-) { }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateReqDto.java
new file mode 100644
index 00000000..cd91c75f
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusCreateReqDto.java
@@ -0,0 +1,9 @@
+package com.sprint.mission.discodeit.dto;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public record UserStatusCreateReqDto(
+ UUID userId,
+ Instant lastActiveAt
+) { }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateDto.java
deleted file mode 100644
index 64e23f0d..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateDto.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.sprint.mission.discodeit.dto;
-
-import java.util.UUID;
-
-public record UserStatusUpdateDto (
- UUID id,
- boolean isOnline
-){ }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateReqDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateReqDto.java
new file mode 100644
index 00000000..ba255af9
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserStatusUpdateReqDto.java
@@ -0,0 +1,7 @@
+package com.sprint.mission.discodeit.dto;
+
+import java.time.Instant;
+
+public record UserStatusUpdateReqDto(
+ Instant newLastActiveAt
+){ }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateReqDto.java
similarity index 63%
rename from discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDto.java
rename to discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateReqDto.java
index 51b0fb31..dd36d539 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateDto.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/UserUpdateReqDto.java
@@ -4,10 +4,8 @@
import java.util.UUID;
-public record UserUpdateDto(
- UUID userId,
+public record UserUpdateReqDto(
String username,
String email,
- String password,
- BinaryContent profile
+ String password
) { }
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java
new file mode 100644
index 00000000..490ed0b4
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java
@@ -0,0 +1,17 @@
+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
+) {
+}
\ No newline at end of file
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java
new file mode 100644
index 00000000..6b528c34
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java
@@ -0,0 +1,16 @@
+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/discodeit/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
index 6c1c8d5c..94e175cf 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java
@@ -16,14 +16,16 @@ public class BinaryContent implements Serializable {
private final Instant createdAt;
private String fileName;
- private String contentType;
private Long size;
+ private String contentType;
+ private byte[] bytes;
- public BinaryContent(String fileName,String contentType, Long size) {
+ public BinaryContent(String fileName,Long size, String contentType, byte[] bytes) {
this.id = UUID.randomUUID();
this.createdAt = Instant.now();
this.fileName = fileName;
- this.contentType = contentType;
this.size = size;
+ this.contentType = contentType;
+ this.bytes = bytes;
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
index 1d8e3e05..8325082e 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java
@@ -18,19 +18,26 @@ public class ReadStatus implements Serializable {
private UUID userId;
private UUID channelId;
- private boolean isRead;
+ private Instant lastReadAt;
- public ReadStatus(UUID userId, UUID channelId) {
+ public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) {
this.id = UUID.randomUUID();
this.createdAt = Instant.now();
this.updatedAt = Instant.now();
this.userId = userId;
this.channelId = channelId;
- isRead = false;
+ this.lastReadAt = lastReadAt;
}
- public void update(boolean isRead){
- this.isRead = isRead;
- updatedAt = Instant.now();
+ public void update(Instant newLastReadAt){
+ boolean anyValueUpdated = false;
+ if (newLastReadAt != null && !newLastReadAt.equals(this.lastReadAt)) {
+ this.lastReadAt = newLastReadAt;
+ anyValueUpdated = true;
+ }
+
+ if (anyValueUpdated) {
+ this.updatedAt = Instant.now();
+ }
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/User.java b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/User.java
index d70fd662..77d292d8 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/User.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/User.java
@@ -1,12 +1,14 @@
package com.sprint.mission.discodeit.entity;
import lombok.Getter;
+import lombok.Setter;
import java.io.Serializable;
import java.time.Instant;
import java.util.UUID;
@Getter
+@Setter
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@@ -19,16 +21,18 @@ public class User implements Serializable {
private String password;
private UUID profileId; // 프사 파일
- public User(String username, String email, String password) {
+ 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) {
+ public void update(String newUsername, String newEmail, String newPassword, UUID newProfileId) {
boolean anyValueUpdated = false;
if (newUsername != null && !newUsername.equals(this.username)) {
this.username = newUsername;
@@ -42,9 +46,14 @@ public void update(String newUsername, String newEmail, String newPassword) {
this.password = newPassword;
anyValueUpdated = true;
}
+ if (newProfileId != null && !newProfileId.equals(this.profileId)) {
+ this.profileId = newProfileId;
+ anyValueUpdated = true;
+ }
if (anyValueUpdated) {
this.updatedAt = Instant.now();
}
+
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
index e52a7c06..36c20309 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java
@@ -4,6 +4,7 @@
import java.io.Serial;
import java.io.Serializable;
+import java.time.Duration;
import java.time.Instant;
import java.util.UUID;
@@ -17,26 +18,32 @@ public class UserStatus implements Serializable {
private Instant updatedAt;
private UUID userId;
- boolean isOnline;
+ private Instant lastActiveAt;
- public UserStatus(UUID userId) {
+
+ public UserStatus(UUID userId, Instant lastActiveAt) {
this.id = UUID.randomUUID();
this.createdAt = Instant.now();
this.updatedAt = Instant.now();
this.userId = userId;
+ this.lastActiveAt = lastActiveAt;
}
- public boolean stillOnline(){
- if(updatedAt.isAfter(Instant.now().minusSeconds(300))){
- isOnline = true;
- }
- else{
- isOnline = false;
- }
- return isOnline;
+ public Boolean isOnline() {
+ Instant instantFiveMinutesAgo = Instant.now().minus(Duration.ofMinutes(5));
+
+ return lastActiveAt.isAfter(instantFiveMinutesAgo);
}
- public void update(boolean online) {
- this.isOnline = online;
+ public void update(Instant lastActiveAt) {
+ boolean anyValueUpdated = false;
+ if (lastActiveAt != null && !lastActiveAt.equals(this.lastActiveAt)) {
+ this.lastActiveAt = lastActiveAt;
+ anyValueUpdated = true;
+ }
+
+ if (anyValueUpdated) {
+ this.updatedAt = Instant.now();
+ }
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
index cfb54a96..b3d4a05a 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java
@@ -1,6 +1,6 @@
package com.sprint.mission.discodeit.repository;
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
import com.sprint.mission.discodeit.entity.BinaryContent;
import java.util.List;
@@ -8,9 +8,9 @@
import java.util.UUID;
public interface BinaryContentRepository {
- BinaryContent save(BinaryContentCreateDto binaryContentCreateDto);
+ BinaryContent save(BinaryContent binaryContent);
Optional findById(UUID id);
- List findAll();
- Boolean existsById(UUID id);
+ List findAllByIdIn(List ids);
+ boolean existsById(UUID id);
void deleteById(UUID id);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
index 1477de72..69547b22 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java
@@ -9,7 +9,8 @@
public interface MessageRepository {
Message save(Message message);
Optional findById(UUID id);
- List findAll();
+ List findAllByChannelId(UUID channelId);
boolean existsById(UUID id);
void deleteById(UUID id);
+ void deleteAllByChannelId(UUID channelId);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
index d84a000c..db512298 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java
@@ -9,10 +9,8 @@
public interface ReadStatusRepository {
ReadStatus save(ReadStatus readStatus);
Optional findById(UUID id);
- List findUserIdByChannelId(UUID channelId);
- List findChannelIdByUserId(UUID userId);
- Optional findByChannelAndUser(UUID channelId, UUID userId);
- List findAll();
- Boolean existsById(UUID id);
+ List findAllByUserId(UUID userId);
+ List findAllByChannelId(UUID channelId);
+ boolean existsById(UUID id);
void deleteById(UUID id);
-}
+ void deleteAllByChannelId(UUID channelId);}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
index f449de1e..5027a343 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java
@@ -7,8 +7,18 @@
public interface UserRepository {
User save(User user);
+
Optional findById(UUID id);
+
+ Optional findByUsername(String username);
+
List findAll();
+
boolean existsById(UUID id);
+
void deleteById(UUID id);
+
+ boolean existsByEmail(String email);
+
+ boolean existsByUsername(String username);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
index 8e982ca0..42a5861f 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java
@@ -1,10 +1,9 @@
package com.sprint.mission.discodeit.repository.file;
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
import com.sprint.mission.discodeit.entity.BinaryContent;
-import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.BinaryContentRepository;
-import jakarta.websocket.Decoder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -14,14 +13,18 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileBinaryContentRepository implements BinaryContentRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileBinaryContentRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", BinaryContent.class.getSimpleName());
+ public FileBinaryContentRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, BinaryContent.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -31,14 +34,12 @@ public FileBinaryContentRepository() {
}
}
-
private Path resolvePath(UUID id) {
return DIRECTORY.resolve(id + EXTENSION);
}
@Override
- public BinaryContent save(BinaryContentCreateDto dto) {
- BinaryContent binaryContent = new BinaryContent(dto.fileName(), dto.contentType(), dto.size());
+ public BinaryContent save(BinaryContent binaryContent) {
Path path = resolvePath(binaryContent.getId());
try (
FileOutputStream fos = new FileOutputStream(path.toFile());
@@ -53,25 +54,25 @@ public BinaryContent save(BinaryContentCreateDto dto) {
@Override
public Optional findById(UUID id) {
- BinaryContent fileNullable = null;
+ BinaryContent binaryContentNullable = null;
Path path = resolvePath(id);
if (Files.exists(path)) {
try (
FileInputStream fis = new FileInputStream(path.toFile());
ObjectInputStream ois = new ObjectInputStream(fis)
) {
- fileNullable = (BinaryContent) ois.readObject();
+ binaryContentNullable = (BinaryContent) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
- return Optional.ofNullable(fileNullable);
+ return Optional.ofNullable(binaryContentNullable);
}
@Override
- public List findAll() {
- try {
- return Files.list(DIRECTORY)
+ public List findAllByIdIn(List ids) {
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
@@ -83,6 +84,7 @@ public List findAll() {
throw new RuntimeException(e);
}
})
+ .filter(content -> ids.contains(content.getId()))
.toList();
} catch (IOException e) {
throw new RuntimeException(e);
@@ -90,7 +92,7 @@ public List findAll() {
}
@Override
- public Boolean existsById(UUID id) {
+ public boolean existsById(UUID id) {
Path path = resolvePath(id);
return Files.exists(path);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
index 48b7de34..a345b967 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java
@@ -2,6 +2,8 @@
import com.sprint.mission.discodeit.entity.Channel;
import com.sprint.mission.discodeit.repository.ChannelRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -11,14 +13,18 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileChannelRepository implements ChannelRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileChannelRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", Channel.class.getSimpleName());
+ public FileChannelRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, Channel.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -65,8 +71,8 @@ public Optional findById(UUID id) {
@Override
public List findAll() {
- try {
- return Files.list(DIRECTORY)
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
index bf71910f..5705d82a 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java
@@ -2,6 +2,8 @@
import com.sprint.mission.discodeit.entity.Message;
import com.sprint.mission.discodeit.repository.MessageRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -11,14 +13,18 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileMessageRepository implements MessageRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileMessageRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", Message.class.getSimpleName());
+ public FileMessageRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, Message.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -64,9 +70,9 @@ public Optional findById(UUID id) {
}
@Override
- public List findAll() {
- try {
- return Files.list(DIRECTORY)
+ public List findAllByChannelId(UUID channelId) {
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
@@ -78,6 +84,7 @@ public List findAll() {
throw new RuntimeException(e);
}
})
+ .filter(message -> message.getChannelId().equals(channelId))
.toList();
} catch (IOException e) {
throw new RuntimeException(e);
@@ -99,4 +106,10 @@ public void deleteById(UUID id) {
throw new RuntimeException(e);
}
}
+
+ @Override
+ public void deleteAllByChannelId(UUID channelId) {
+ this.findAllByChannelId(channelId)
+ .forEach(message -> this.deleteById(message.getId()));
+ }
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
index 2b2e27c6..f5f96d0d 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java
@@ -3,6 +3,8 @@
import com.sprint.mission.discodeit.entity.ReadStatus;
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.ReadStatusRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -12,14 +14,18 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileReadStatusRepository implements ReadStatusRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileReadStatusRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", ReadStatus.class.getSimpleName());
+ public FileReadStatusRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, ReadStatus.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -65,33 +71,31 @@ public Optional findById(UUID id) {
}
@Override
- public List findUserIdByChannelId(UUID channelId) {
- return findAll().stream()
- .filter(r->r.getChannelId().equals(channelId))
- .map(ReadStatus::getUserId)
- .toList();
- }
-
- @Override
- public List findChannelIdByUserId(UUID userId) {
- return findAll().stream()
- .filter(r->r.getUserId().equals(userId))
- .map(ReadStatus::getChannelId)
- .toList();
- }
-
- @Override
- public Optional findByChannelAndUser(UUID channelId, UUID userId) {
- return findAll().stream()
- .filter(r->r.getChannelId().equals(channelId))
- .filter(r->r.getUserId().equals(userId))
- .findAny();
+ public List findAllByUserId(UUID userId) {
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
+ .filter(path -> path.toString().endsWith(EXTENSION))
+ .map(path -> {
+ try (
+ FileInputStream fis = new FileInputStream(path.toFile());
+ ObjectInputStream ois = new ObjectInputStream(fis)
+ ) {
+ return (ReadStatus) ois.readObject();
+ } catch (IOException | ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ })
+ .filter(readStatus -> readStatus.getUserId().equals(userId))
+ .toList();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
@Override
- public List findAll() {
- try {
- return Files.list(DIRECTORY)
+ public List findAllByChannelId(UUID channelId) {
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
@@ -103,6 +107,7 @@ public List findAll() {
throw new RuntimeException(e);
}
})
+ .filter(readStatus -> readStatus.getChannelId().equals(channelId))
.toList();
} catch (IOException e) {
throw new RuntimeException(e);
@@ -110,7 +115,7 @@ public List findAll() {
}
@Override
- public Boolean existsById(UUID id) {
+ public boolean existsById(UUID id) {
Path path = resolvePath(id);
return Files.exists(path);
}
@@ -124,4 +129,10 @@ public void deleteById(UUID id) {
throw new RuntimeException(e);
}
}
+
+ @Override
+ public void deleteAllByChannelId(UUID channelId) {
+ this.findAllByChannelId(channelId)
+ .forEach(readStatus -> this.deleteById(readStatus.getId()));
+ }
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
index 51eb115c..b7fa1c1b 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java
@@ -2,6 +2,8 @@
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -11,14 +13,18 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileUserRepository implements UserRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileUserRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", User.class.getSimpleName());
+ public FileUserRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, User.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -63,10 +69,17 @@ public Optional findById(UUID id) {
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 {
- return Files.list(DIRECTORY)
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
@@ -99,4 +112,16 @@ public void deleteById(UUID id) {
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/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
index a7db7ce3..580309d2 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java
@@ -3,6 +3,8 @@
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.entity.UserStatus;
import com.sprint.mission.discodeit.repository.UserStatusRepository;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.io.*;
@@ -13,14 +15,18 @@
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.UUID;
+import java.util.stream.Stream;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
@Repository
public class FileUserStatusRepository implements UserStatusRepository {
private final Path DIRECTORY;
private final String EXTENSION = ".ser";
- public FileUserStatusRepository() {
- this.DIRECTORY = Paths.get(System.getProperty("user.dir"), "file-data-map", UserStatus.class.getSimpleName());
+ public FileUserStatusRepository(
+ @Value("${discodeit.repository.file-directory:data}") String fileDirectory
+ ) {
+ this.DIRECTORY = Paths.get(System.getProperty("user.dir"), fileDirectory, UserStatus.class.getSimpleName());
if (Files.notExists(DIRECTORY)) {
try {
Files.createDirectories(DIRECTORY);
@@ -30,7 +36,6 @@ public FileUserStatusRepository() {
}
}
-
private Path resolvePath(UUID id) {
return DIRECTORY.resolve(id + EXTENSION);
}
@@ -64,20 +69,19 @@ public Optional findById(UUID id) {
}
}
return Optional.ofNullable(userStatusNullable);
-
}
@Override
public Optional findByUserId(UUID userId) {
return findAll().stream()
- .filter(u->u.getUserId().equals(userId))
- .findAny();
+ .filter(userStatus -> userStatus.getUserId().equals(userId))
+ .findFirst();
}
@Override
public List findAll() {
- try {
- return Files.list(DIRECTORY)
+ try (Stream paths = Files.list(DIRECTORY)) {
+ return paths
.filter(path -> path.toString().endsWith(EXTENSION))
.map(path -> {
try (
@@ -113,16 +117,7 @@ public void deleteById(UUID id) {
@Override
public void deleteByUserId(UUID userId) {
- Optional target = findByUserId(userId);
- if(target.isEmpty()){
- throw new NoSuchElementException("Can't find user status");
- }
- UUID id = target.get().getId();
- Path path = resolvePath(id);
- try {
- Files.delete(path);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ this.findByUserId(userId)
+ .ifPresent(userStatus -> this.deleteById(userStatus.getId()));
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
index db4a87cc..b231c8e8 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java
@@ -1,12 +1,14 @@
package com.sprint.mission.discodeit.repository.jcf;
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
import com.sprint.mission.discodeit.entity.BinaryContent;
import com.sprint.mission.discodeit.repository.BinaryContentRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
public class JCFBinaryContentRepository implements BinaryContentRepository {
private final Map data;
@@ -15,10 +17,8 @@ public JCFBinaryContentRepository() {
this.data = new HashMap<>();
}
-
@Override
- public BinaryContent save(BinaryContentCreateDto dto) {
- BinaryContent binaryContent = new BinaryContent(dto.fileName(), dto.contentType(), dto.size());
+ public BinaryContent save(BinaryContent binaryContent) {
this.data.put(binaryContent.getId(), binaryContent);
return binaryContent;
}
@@ -26,17 +26,17 @@ public BinaryContent save(BinaryContentCreateDto dto) {
@Override
public Optional findById(UUID id) {
return Optional.ofNullable(this.data.get(id));
-
}
@Override
- public List findAll() {
- return this.data.values().stream().toList();
-
+ public List findAllByIdIn(List ids) {
+ return this.data.values().stream()
+ .filter(content -> ids.contains(content.getId()))
+ .toList();
}
@Override
- public Boolean existsById(UUID id) {
+ public boolean existsById(UUID id) {
return this.data.containsKey(id);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
index e11c92da..5e4ec928 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java
@@ -2,9 +2,13 @@
import com.sprint.mission.discodeit.entity.Channel;
import com.sprint.mission.discodeit.repository.ChannelRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
+@Repository
public class JCFChannelRepository implements ChannelRepository {
private final Map data;
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
index 5ad8b355..c0039f96 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java
@@ -2,9 +2,13 @@
import com.sprint.mission.discodeit.entity.Message;
import com.sprint.mission.discodeit.repository.MessageRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
+@Repository
public class JCFMessageRepository implements MessageRepository {
private final Map data;
@@ -24,8 +28,8 @@ public Optional findById(UUID id) {
}
@Override
- public List findAll() {
- return this.data.values().stream().toList();
+ public List findAllByChannelId(UUID channelId) {
+ return this.data.values().stream().filter(message -> message.getChannelId().equals(channelId)).toList();
}
@Override
@@ -37,4 +41,10 @@ public boolean existsById(UUID id) {
public void deleteById(UUID id) {
this.data.remove(id);
}
+
+ @Override
+ public void deleteAllByChannelId(UUID channelId) {
+ this.findAllByChannelId(channelId)
+ .forEach(message -> this.deleteById(message.getId()));
+ }
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
index 9e456432..9c483eeb 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java
@@ -2,10 +2,12 @@
import com.sprint.mission.discodeit.entity.ReadStatus;
import com.sprint.mission.discodeit.repository.ReadStatusRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
public class JCFReadStatusRepository implements ReadStatusRepository {
private final Map data;
@@ -26,36 +28,21 @@ public Optional findById(UUID id) {
}
@Override
- public List findUserIdByChannelId(UUID channelId) {
- return findAll().stream()
- .filter(r->r.getChannelId().equals(channelId))
- .map(ReadStatus::getUserId)
+ public List findAllByUserId(UUID userId) {
+ return this.data.values().stream()
+ .filter(readStatus -> readStatus.getUserId().equals(userId))
.toList();
}
@Override
- public List findChannelIdByUserId(UUID userId) {
- return findAll().stream()
- .filter(r->r.getUserId().equals(userId))
- .map(ReadStatus::getChannelId)
+ public List findAllByChannelId(UUID channelId) {
+ return this.data.values().stream()
+ .filter(readStatus -> readStatus.getChannelId().equals(channelId))
.toList();
}
@Override
- public Optional findByChannelAndUser(UUID channelId, UUID userId) {
- return findAll().stream()
- .filter(r->r.getUserId().equals(userId))
- .filter(r->r.getChannelId().equals(channelId))
- .findAny();
- }
-
- @Override
- public List findAll() {
- return this.data.values().stream().toList();
- }
-
- @Override
- public Boolean existsById(UUID id) {
+ public boolean existsById(UUID id) {
return this.data.containsKey(id);
}
@@ -63,4 +50,10 @@ public Boolean existsById(UUID id) {
public void deleteById(UUID id) {
this.data.remove(id);
}
+
+ @Override
+ public void deleteAllByChannelId(UUID channelId) {
+ this.findAllByChannelId(channelId)
+ .forEach(readStatus -> this.deleteById(readStatus.getId()));
+ }
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
index a60363a3..93e203fd 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java
@@ -2,9 +2,13 @@
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.repository.UserRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
+@Repository
public class JCFUserRepository implements UserRepository {
private final Map data;
@@ -23,6 +27,13 @@ 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();
@@ -37,4 +48,14 @@ public boolean existsById(UUID id) {
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));
+ }
+}
\ No newline at end of file
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
index 79b1c28f..2f6e27e2 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java
@@ -3,10 +3,12 @@
import com.sprint.mission.discodeit.entity.ReadStatus;
import com.sprint.mission.discodeit.entity.UserStatus;
import com.sprint.mission.discodeit.repository.UserStatusRepository;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Repository;
import java.util.*;
+@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
@Repository
public class JCFUserStatusRepository implements UserStatusRepository {
private final Map data;
@@ -28,9 +30,9 @@ public Optional findById(UUID id) {
@Override
public Optional findByUserId(UUID userId) {
- return findAll().stream()
- .filter(u->u.getUserId().equals(userId))
- .findAny();
+ return this.findAll().stream()
+ .filter(userStatus -> userStatus.getUserId().equals(userId))
+ .findFirst();
}
@Override
@@ -46,14 +48,11 @@ public boolean existsById(UUID id) {
@Override
public void deleteById(UUID id) {
this.data.remove(id);
-
}
@Override
public void deleteByUserId(UUID userId) {
- if(findByUserId(userId).isPresent()) {
- UUID id = findByUserId(userId).get().getId();
- this.data.remove(id);
- }
+ this.findByUserId(userId)
+ .ifPresent(userStatus -> this.deleteByUserId(userStatus.getId()));
}
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
index 6edb56df..5808cddd 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/AuthService.java
@@ -1,23 +1,8 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.UserLoginDto;
+import com.sprint.mission.discodeit.dto.UserLoginReqDto;
import com.sprint.mission.discodeit.entity.User;
-import com.sprint.mission.discodeit.repository.UserRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-import java.util.NoSuchElementException;
-
-@Service
-@RequiredArgsConstructor
-public class AuthService {
- private final UserRepository userRepository;
-
- public User login(UserLoginDto userLoginDto){
- return userRepository.findAll().stream()
- .filter(u -> u.getUsername().equals(userLoginDto.username()))
- .filter(u->u.getPassword().equals(userLoginDto.password()))
- .findAny()
- .orElseThrow(()->new NoSuchElementException("No user found"));
- }
+public interface AuthService {
+ User login(UserLoginReqDto dto);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java
new file mode 100644
index 00000000..a45838f9
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java
@@ -0,0 +1,14 @@
+package com.sprint.mission.discodeit.service;
+
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.entity.BinaryContent;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface BinaryContentService {
+ BinaryContent create(BinaryContentCreateReqDto dto);
+ BinaryContent find(UUID binaryContentId);
+ List findAllByIdIn(List binaryContentIds);
+ void delete(UUID binaryContentId);
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
index f07a8785..9bd442f7 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java
@@ -1,20 +1,18 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.ChannelFindResDto;
-import com.sprint.mission.discodeit.dto.ChannelUpdateDto;
-import com.sprint.mission.discodeit.dto.PrivateChannelDto;
-import com.sprint.mission.discodeit.dto.PublicChannelDto;
+import com.sprint.mission.discodeit.dto.PrivateChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.ChannelDto;
import com.sprint.mission.discodeit.entity.Channel;
-import com.sprint.mission.discodeit.entity.ChannelType;
import java.util.List;
import java.util.UUID;
public interface ChannelService {
- Channel createPublicChannel(PublicChannelDto publicChannelDto);
- Channel createPrivateChannel(PrivateChannelDto privateChannelDto);
- ChannelFindResDto find(UUID channelId);
- List findAllByUserId(UUID userId);
- Channel update(ChannelUpdateDto channelUpdateDto);
- void delete(UUID channelId);
-}
+ Channel create(PublicChannelCreateReqDto dto);
+ Channel create(PrivateChannelCreateReqDto dto);
+ ChannelDto find(UUID channelId);
+ List findAllByUserId(UUID userId);
+ Channel update(UUID channelId, PublicChannelUpdateReqDto dto);
+ void delete(UUID channelId);}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
index b277aff0..ef34e420 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/MessageService.java
@@ -1,15 +1,16 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.MessageCreateDto;
-import com.sprint.mission.discodeit.dto.MessageUpdateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageUpdateReqDto;
import com.sprint.mission.discodeit.entity.Message;
import java.util.List;
import java.util.UUID;
public interface MessageService {
- Message create(MessageCreateDto messageCreateDto);
+ Message create(MessageCreateReqDto messageCreateRequest, List binaryContentCreateRequests);
Message find(UUID messageId);
List findAllByChannelId(UUID channelId);
- Message update(MessageUpdateDto messageUpdateDto);
+ Message update(UUID messageId, MessageUpdateReqDto request);
void delete(UUID messageId);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java
new file mode 100644
index 00000000..0b972710
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java
@@ -0,0 +1,16 @@
+package com.sprint.mission.discodeit.service;
+
+import com.sprint.mission.discodeit.dto.ReadStatusCreateReqDto;
+import com.sprint.mission.discodeit.dto.ReadStatusUpdateReqDto;
+import com.sprint.mission.discodeit.entity.ReadStatus;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface ReadStatusService {
+ ReadStatus create(ReadStatusCreateReqDto request);
+ ReadStatus find(UUID readStatusId);
+ List findAllByUserId(UUID userId);
+ ReadStatus update(UUID readStatusId, ReadStatusUpdateReqDto request);
+ void delete(UUID readStatusId);
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserService.java
index e76f25a7..76372f67 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserService.java
@@ -1,17 +1,19 @@
package com.sprint.mission.discodeit.service;
-import com.sprint.mission.discodeit.dto.UseCreaterDto;
-import com.sprint.mission.discodeit.dto.UserFindResDto;
-import com.sprint.mission.discodeit.dto.UserUpdateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.UserDto;
import com.sprint.mission.discodeit.entity.User;
import java.util.List;
+import java.util.Optional;
import java.util.UUID;
public interface UserService {
- User create(UseCreaterDto useCreaterDto);
- UserFindResDto find(UUID userId);
- List findAll();
- User update(UserUpdateDto userUpdateDto);
+ User create(UserCreateReqDto userCreateRequest, Optional profileCreateRequest);
+ UserDto find(UUID userId);
+ List findAll();
+ User update(UUID userId, UserUpdateReqDto userUpdateRequest, Optional profileCreateRequest);
void delete(UUID userId);
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java
new file mode 100644
index 00000000..4e4c8205
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java
@@ -0,0 +1,17 @@
+package com.sprint.mission.discodeit.service;
+
+import com.sprint.mission.discodeit.dto.UserStatusCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserStatusUpdateReqDto;
+import com.sprint.mission.discodeit.entity.UserStatus;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface UserStatusService {
+ UserStatus create(UserStatusCreateReqDto request);
+ UserStatus find(UUID userStatusId);
+ List findAll();
+ UserStatus update(UUID userStatusId, UserStatusUpdateReqDto request);
+ UserStatus updateByUserId(UUID userId, UserStatusUpdateReqDto request);
+ void delete(UUID userStatusId);
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java
new file mode 100644
index 00000000..a16d646a
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java
@@ -0,0 +1,39 @@
+package com.sprint.mission.discodeit.service.basic;
+
+import com.sprint.mission.discodeit.dto.UserLoginReqDto;
+import com.sprint.mission.discodeit.dto.UserStatusUpdateReqDto;
+import com.sprint.mission.discodeit.entity.User;
+import com.sprint.mission.discodeit.entity.UserStatus;
+import com.sprint.mission.discodeit.repository.UserRepository;
+import com.sprint.mission.discodeit.repository.UserStatusRepository;
+import com.sprint.mission.discodeit.service.AuthService;
+import com.sprint.mission.discodeit.service.UserStatusService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.NoSuchElementException;
+
+@RequiredArgsConstructor
+@Service
+public class BasicAuthService implements AuthService {
+ private final UserRepository userRepository;
+ private final UserStatusService userStatusService;
+
+ @Override
+ public User login(UserLoginReqDto 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");
+ }
+ UserStatusUpdateReqDto dto = new UserStatusUpdateReqDto(Instant.now());
+ userStatusService.updateByUserId(user.getId(), dto);
+
+ return user;
+ }
+}
\ No newline at end of file
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java
new file mode 100644
index 00000000..9b034cf7
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java
@@ -0,0 +1,52 @@
+package com.sprint.mission.discodeit.service.basic;
+
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+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.*;
+
+@Service
+@RequiredArgsConstructor
+public class BasicBinaryContentService implements BinaryContentService {
+ private final BinaryContentRepository binaryContentRepository;
+
+ @Override
+ public BinaryContent create(
+ BinaryContentCreateReqDto 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/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java
index c67ff1da..ed175690 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java
@@ -1,21 +1,19 @@
package com.sprint.mission.discodeit.service.basic;
-import com.sprint.mission.discodeit.dto.ChannelFindResDto;
-import com.sprint.mission.discodeit.dto.ChannelUpdateDto;
-import com.sprint.mission.discodeit.dto.PrivateChannelDto;
-import com.sprint.mission.discodeit.dto.PublicChannelDto;
+import com.sprint.mission.discodeit.dto.PrivateChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelCreateReqDto;
+import com.sprint.mission.discodeit.dto.PublicChannelUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.ChannelDto;
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.repository.UserRepository;
import com.sprint.mission.discodeit.service.ChannelService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.*;
-import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -25,90 +23,99 @@ public class BasicChannelService implements ChannelService {
private final MessageRepository messageRepository;
@Override
- public Channel createPublicChannel(PublicChannelDto publicChannelDto) {
- Channel channel = new Channel(publicChannelDto.type(), publicChannelDto.name(), publicChannelDto.description());
+ public Channel create(PublicChannelCreateReqDto request) {
+ String name = request.name();
+ String description = request.description();
+ Channel channel = new Channel(ChannelType.PUBLIC, name, description);
+
return channelRepository.save(channel);
}
@Override
- public Channel createPrivateChannel(PrivateChannelDto privateChannelDto) {
- Channel channel = new Channel(privateChannelDto.type(), null,null);
- Channel saved = channelRepository.save(channel);
- privateChannelDto.userIdList()
- .forEach(u->{
- ReadStatus readStatus = new ReadStatus(u, saved.getId());
- readStatusRepository.save(readStatus);
- });
-
- return saved;
+ public Channel create(PrivateChannelCreateReqDto request) {
+ String name = request.name();
+ String description = request.description();
+ Channel channel = new Channel(ChannelType.PRIVATE, name, description);
+ Channel createdChannel = channelRepository.save(channel);
+
+ request.participantIds().stream()
+ .map(userId -> new ReadStatus(userId, createdChannel.getId(), Instant.MIN))
+ .forEach(readStatusRepository::save);
+
+ return createdChannel;
}
@Override
- public ChannelFindResDto find(UUID channelId) {
- Channel channel = channelRepository.findById(channelId)
- .orElseThrow(() -> new IllegalArgumentException("Can't find channel"));
- List messages = messageRepository.findAll().stream()
- .filter(m->m.getChannelId().equals(channelId)).toList();
- Instant lastMessageTime = messages.stream()
- .map(Message::getCreatedAt)
- .max(Comparator.naturalOrder()).orElse(null);
- if(channel.getType().equals(ChannelType.PRIVATE)){
- List userIdList = readStatusRepository.findUserIdByChannelId(channelId);
- return new ChannelFindResDto(channel, lastMessageTime, userIdList);
- }
- else{
- return new ChannelFindResDto(channel, lastMessageTime, null);
- }
-
+ 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 publicChannelIdList = channelRepository.findAll().stream()
- .filter(c->c.getType().equals(ChannelType.PUBLIC))
- .map(Channel::getId)
+ public List findAllByUserId(UUID userId) {
+ List mySubscribedChannelIds = readStatusRepository.findAllByUserId(userId).stream()
+ .map(ReadStatus::getChannelId)
.toList();
- List myPrivateChannelIdList = readStatusRepository.findChannelIdByUserId(userId);
- List myPrivateChannelOnlyList = myPrivateChannelIdList.stream()
- .filter(i->!publicChannelIdList.contains(i))
+
+ return channelRepository.findAll().stream()
+ .filter(channel ->
+ channel.getType().equals(ChannelType.PUBLIC)
+ || mySubscribedChannelIds.contains(channel.getId())
+ )
+ .map(this::toDto)
.toList();
- List result = new ArrayList<>();
- for(UUID u:publicChannelIdList){
- result.add(find(u));
- }
- for(UUID u:myPrivateChannelOnlyList){
- result.add(find(u));
- }
- return result;
}
@Override
- public Channel update(ChannelUpdateDto channelUpdateDto) {
- Channel channel = channelRepository.findById(channelUpdateDto.channelId())
- .orElseThrow(() -> new NoSuchElementException("Channel with id " + channelUpdateDto.channelId() + " not found"));
- if(channel.getType().equals(ChannelType.PRIVATE)) {
- return channelRepository.save(channel);
+ public Channel update(UUID channelId, PublicChannelUpdateReqDto 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(channelUpdateDto.newName(), channelUpdateDto.newDescription());
+ channel.update(newName, newDescription);
return channelRepository.save(channel);
}
@Override
public void delete(UUID channelId) {
- if (!channelRepository.existsById(channelId)) {
- throw new NoSuchElementException("Channel with id " + channelId + " not found");
- }
- List targetReadStatus = readStatusRepository.findAll().stream()
- .filter(r->r.getChannelId().equals(channelId))
- .toList();
- for(ReadStatus r:targetReadStatus){
- readStatusRepository.deleteById(r.getId());
- }
- List targetMessage = messageRepository.findAll().stream()
- .filter(m->m.getChannelId().equals(channelId)).toList();
- for(Message m:targetMessage){
- messageRepository.deleteById(m.getId());
- }
+ 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/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java
index 3e34947a..124fd6e7 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java
@@ -1,8 +1,8 @@
package com.sprint.mission.discodeit.service.basic;
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
-import com.sprint.mission.discodeit.dto.MessageCreateDto;
-import com.sprint.mission.discodeit.dto.MessageUpdateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageCreateReqDto;
+import com.sprint.mission.discodeit.dto.MessageUpdateReqDto;
import com.sprint.mission.discodeit.entity.BinaryContent;
import com.sprint.mission.discodeit.entity.Message;
import com.sprint.mission.discodeit.repository.BinaryContentRepository;
@@ -27,27 +27,36 @@ public class BasicMessageService implements MessageService {
private final BinaryContentRepository binaryContentRepository;
@Override
- public Message create(MessageCreateDto messageCreateDto) {
- if (!channelRepository.existsById(messageCreateDto.channelId())) {
- throw new NoSuchElementException("Channel not found with id " + messageCreateDto.channelId());
+ public Message create(MessageCreateReqDto 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(messageCreateDto.authorId())) {
- throw new NoSuchElementException("Author not found with id " + messageCreateDto.authorId());
+ if (!userRepository.existsById(authorId)) {
+ throw new NoSuchElementException("Author with id " + authorId + " does not exist");
}
- List binaryContent = messageCreateDto.files();
- if(binaryContent != null){
- for(BinaryContent b:binaryContent){
- BinaryContentCreateDto dto = new BinaryContentCreateDto(b.getFileName(),b.getContentType(),b.getSize());
- binaryContentRepository.save(dto);
- }
- List binaryContentIdList = binaryContent.stream()
- .map(BinaryContent::getId)
- .toList();
- Message message = new Message(messageCreateDto.content(), messageCreateDto.channelId(), messageCreateDto.authorId(), binaryContentIdList);
- }
- Message message = new Message(messageCreateDto.content(), messageCreateDto.channelId(), messageCreateDto.authorId(), null);
+ 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);
}
@@ -59,28 +68,28 @@ public Message find(UUID messageId) {
@Override
public List findAllByChannelId(UUID channelId) {
- return messageRepository.findAll().stream()
- .filter(m -> m.getChannelId().equals(channelId))
+ return messageRepository.findAllByChannelId(channelId).stream()
.toList();
}
@Override
- public Message update(MessageUpdateDto messageUpdateDto) {
- Message message = messageRepository.findById(messageUpdateDto.messageId())
- .orElseThrow(() -> new NoSuchElementException("Message with id " + messageUpdateDto.messageId() + " not found"));
- message.update(messageUpdateDto.newContent());
+ public Message update(UUID messageId, MessageUpdateReqDto 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) {
- if (!messageRepository.existsById(messageId)) {
- throw new NoSuchElementException("Message with id " + messageId + " not found");
- }
- List attachmentIdList = messageRepository.findById(messageId).get().getAttachmentIds();
- for(UUID u:attachmentIdList){
- binaryContentRepository.deleteById(u);
- }
+ 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/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java
new file mode 100644
index 00000000..933ef259
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java
@@ -0,0 +1,76 @@
+package com.sprint.mission.discodeit.service.basic;
+
+import com.sprint.mission.discodeit.dto.ReadStatusCreateReqDto;
+import com.sprint.mission.discodeit.dto.ReadStatusUpdateReqDto;
+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;
+
+@Service
+@RequiredArgsConstructor
+public class BasicReadStatusService implements ReadStatusService {
+ private final ReadStatusRepository readStatusRepository;
+ private final UserRepository userRepository;
+ private final ChannelRepository channelRepository;
+
+ @Override
+ public ReadStatus create(ReadStatusCreateReqDto 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");
+ }
+ if (readStatusRepository.findAllByUserId(userId).stream()
+ .anyMatch(readStatus -> readStatus.getChannelId().equals(channelId))) {
+ throw new IllegalArgumentException("ReadStatus with userId " + userId + " and channelId " + channelId + " already exists");
+ }
+
+ 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 findAllByUserId(UUID userId) {
+ return readStatusRepository.findAllByUserId(userId).stream()
+ .toList();
+ }
+
+ @Override
+ public ReadStatus update(UUID readStatusId, ReadStatusUpdateReqDto request) {
+ Instant newLastReadAt = request.newLastReadAt();
+ ReadStatus readStatus = readStatusRepository.findById(readStatusId)
+ .orElseThrow(() -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found"));
+ readStatus.update(newLastReadAt);
+ return readStatusRepository.save(readStatus);
+ }
+
+ @Override
+ public void delete(UUID readStatusId) {
+ if (!readStatusRepository.existsById(readStatusId)) {
+ throw new NoSuchElementException("ReadStatus with id " + readStatusId + " not found");
+ }
+ readStatusRepository.deleteById(readStatusId);
+ }
+
+
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java
index da5730c6..6c34fb3d 100644
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java
@@ -1,9 +1,9 @@
package com.sprint.mission.discodeit.service.basic;
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
-import com.sprint.mission.discodeit.dto.UseCreaterDto;
-import com.sprint.mission.discodeit.dto.UserFindResDto;
-import com.sprint.mission.discodeit.dto.UserUpdateDto;
+import com.sprint.mission.discodeit.dto.BinaryContentCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserUpdateReqDto;
+import com.sprint.mission.discodeit.dto.data.UserDto;
import com.sprint.mission.discodeit.entity.BinaryContent;
import com.sprint.mission.discodeit.entity.User;
import com.sprint.mission.discodeit.entity.UserStatus;
@@ -14,10 +14,8 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
+import java.time.Instant;
+import java.util.*;
@Service
@RequiredArgsConstructor
@@ -27,74 +25,112 @@ public class BasicUserService implements UserService {
private final BinaryContentRepository binaryContentRepository;
@Override
- public User create(UseCreaterDto useCreaterDto) {
- List allUser = userRepository.findAll();
- allUser.stream()
- .filter(p -> p.getUsername().equals(useCreaterDto.username()))
- .findAny()
- .ifPresent(p->{
- throw new IllegalArgumentException("Already existing user name: " + useCreaterDto.username());
- });
- allUser.stream()
- .filter(p -> p.getEmail().equals(useCreaterDto.email()))
- .findAny()
- .ifPresent(p->{
- throw new IllegalArgumentException("Already existing email: " + useCreaterDto.email());
- });
- User user = new User(useCreaterDto.username(), useCreaterDto.email(), useCreaterDto.password());
- UserStatus userStatus = new UserStatus(user.getId());
- BinaryContentCreateDto binaryContentDto = useCreaterDto.profile();
- userStatusRepository.save(userStatus);
- if(binaryContentDto!=null){
- binaryContentRepository.save(binaryContentDto);
+ public User create(UserCreateReqDto userCreateRequest, Optional optionalProfileCreateRequest) {
+ String username = userCreateRequest.username();
+ String email = userCreateRequest.email();
+
+ if (userRepository.existsByEmail(email)) {
+ throw new IllegalArgumentException("User with email " + email + " already exists");
}
- return userRepository.save(user);
+ if (userRepository.existsByUsername(username)) {
+ throw new IllegalArgumentException("User with username " + username + " already exists");
+ }
+
+ UUID nullableProfileId = optionalProfileCreateRequest
+ .map(profileRequest -> {
+ String fileName = profileRequest.fileName();
+ String contentType = profileRequest.contentType();
+ byte[] bytes = profileRequest.bytes();
+ BinaryContent binaryContent = new BinaryContent(fileName, (long)bytes.length, contentType, bytes);
+ return binaryContentRepository.save(binaryContent).getId();
+ })
+ .orElse(null);
+ String password = userCreateRequest.password();
+
+ User user = new User(username, email, password, nullableProfileId);
+ User createdUser = userRepository.save(user);
+
+ Instant now = Instant.now();
+ UserStatus userStatus = new UserStatus(createdUser.getId(), now);
+ userStatusRepository.save(userStatus);
+
+ return createdUser;
}
@Override
- public UserFindResDto find(UUID userId) {
- User user = userRepository.findById(userId)
+ public UserDto find(UUID userId) {
+ return userRepository.findById(userId)
+ .map(this::toDto)
.orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found"));
- UserStatus userStatus = userStatusRepository.findByUserId(userId)
- .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found"));
- return new UserFindResDto(user.getUsername(),user.getEmail(), userStatus.isOnline());
}
@Override
- public List findAll() {
- List users = userRepository.findAll();
- List userStatuses = userStatusRepository.findAll();
- List results = new ArrayList<>();
- for(User u: users){
- UserStatus userStatus = userStatuses.stream()
- .filter(us -> us.getUserId().equals(u.getId()))
- .findAny()
- .orElseThrow(() -> new NoSuchElementException("User not found"));
- UserFindResDto data = new UserFindResDto(u.getUsername(), u.getEmail(), userStatus.isOnline());
- results.add(data);
- }
- return results;
+ public List findAll() {
+ return userRepository.findAll()
+ .stream()
+ .map(this::toDto)
+ .toList();
}
@Override
- public User update(UserUpdateDto userDto) {
- User user = userRepository.findById(userDto.userId())
- .orElseThrow(() -> new NoSuchElementException("User with id " + userDto.userId() + " not found"));
- user.update(userDto.username(), userDto.email(), userDto.password());
+ public User update(UUID userId, UserUpdateReqDto userUpdateRequest, Optional optionalProfileCreateRequest) {
+ User user = userRepository.findById(userId)
+ .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found"));
+
+ String newUsername = userUpdateRequest.username();
+ String newEmail = userUpdateRequest.email();
+ if (userRepository.existsByEmail(newEmail)) {
+ throw new IllegalArgumentException("User with email " + newEmail + " already exists");
+ }
+ if (userRepository.existsByUsername(newUsername)) {
+ throw new IllegalArgumentException("User with username " + newUsername + " already exists");
+ }
+
+ UUID nullableProfileId = optionalProfileCreateRequest
+ .map(profileRequest -> {
+ Optional.ofNullable(user.getProfileId())
+ .ifPresent(binaryContentRepository::deleteById);
+
+ String fileName = profileRequest.fileName();
+ String contentType = profileRequest.contentType();
+ byte[] bytes = profileRequest.bytes();
+ BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, contentType, bytes);
+ return binaryContentRepository.save(binaryContent).getId();
+ })
+ .orElse(null);
+
+ String newPassword = userUpdateRequest.password();
+ user.update(newUsername, newEmail, newPassword, nullableProfileId);
+
return userRepository.save(user);
}
@Override
public void delete(UUID userId) {
- if (!userRepository.existsById(userId)) {
- throw new NoSuchElementException("User with id " + userId + " not found");
- }
- if(userRepository.findById(userId).isPresent()){
- UUID profileId = userRepository.findById(userId).get().getProfileId();
- binaryContentRepository.deleteById(profileId);
- userStatusRepository.deleteByUserId(userId);
- userRepository.deleteById(userId);
- }
+ User user = userRepository.findById(userId)
+ .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found"));
+ Optional.ofNullable(user.getProfileId())
+ .ifPresent(binaryContentRepository::deleteById);
+ userStatusRepository.deleteByUserId(userId);
+
+ userRepository.deleteById(userId);
}
+
+ private UserDto toDto(User user) {
+ Boolean online = userStatusRepository.findByUserId(user.getId())
+ .map(UserStatus::isOnline)
+ .orElse(null);
+
+ return new UserDto(
+ user.getId(),
+ user.getCreatedAt(),
+ user.getUpdatedAt(),
+ user.getUsername(),
+ user.getEmail(),
+ user.getProfileId(),
+ online
+ );
+ }
+
}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java
new file mode 100644
index 00000000..969a929f
--- /dev/null
+++ b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java
@@ -0,0 +1,82 @@
+package com.sprint.mission.discodeit.service.basic;
+
+import com.sprint.mission.discodeit.dto.UserStatusCreateReqDto;
+import com.sprint.mission.discodeit.dto.UserStatusUpdateReqDto;
+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.time.Instant;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class BasicUserStatusService implements UserStatusService {
+ private final UserStatusRepository userStatusRepository;
+ private final UserRepository userRepository;
+
+ @Override
+ public UserStatus create(UserStatusCreateReqDto request) {
+ UUID userId = request.userId();
+
+ if (!userRepository.existsById(userId)) {
+ throw new NoSuchElementException("User with id " + userId + " does not exist");
+ }
+ if (userStatusRepository.findByUserId(userId).isPresent()) {
+ throw new IllegalArgumentException("UserStatus with id " + userId + " already exists");
+ }
+
+ Instant lastActiveAt = request.lastActiveAt();
+ UserStatus userStatus = new UserStatus(userId, lastActiveAt);
+ return userStatusRepository.save(userStatus);
+ }
+
+ @Override
+ public UserStatus find(UUID userStatusId) {
+ return userStatusRepository.findById(userStatusId)
+ .orElseThrow(() -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found"));
+ }
+
+ @Override
+ public List findAll() {
+ return userStatusRepository.findAll().stream()
+ .toList();
+ }
+
+ @Override
+ public UserStatus update(UUID userStatusId, UserStatusUpdateReqDto request) {
+ Instant newLastActiveAt = request.newLastActiveAt();
+
+ UserStatus userStatus = userStatusRepository.findById(userStatusId)
+ .orElseThrow(() -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found"));
+ userStatus.update(newLastActiveAt);
+
+ return userStatusRepository.save(userStatus);
+ }
+
+ @Override
+ public UserStatus updateByUserId(UUID userId, UserStatusUpdateReqDto request) {
+ Instant newLastActiveAt = request.newLastActiveAt();
+
+ UserStatus userStatus = userStatusRepository.findByUserId(userId)
+ .orElseThrow(() -> new NoSuchElementException("UserStatus with userId " + userId + " not found"));
+ userStatus.update(newLastActiveAt);
+
+ return userStatusRepository.save(userStatus);
+ }
+
+ @Override
+ public void delete(UUID userStatusId) {
+ if (!userStatusRepository.existsById(userStatusId)) {
+ throw new NoSuchElementException("UserStatus with id " + userStatusId + " not found");
+ }
+ userStatusRepository.deleteById(userStatusId);
+ }
+
+
+}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BinaryContentService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BinaryContentService.java
deleted file mode 100644
index 5684024b..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/BinaryContentService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
-import com.sprint.mission.discodeit.entity.BinaryContent;
-import com.sprint.mission.discodeit.repository.BinaryContentRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-
-@Service
-@RequiredArgsConstructor
-public class BinaryContentService {
- private final BinaryContentRepository binaryContentRepository;
-
- public BinaryContent create(BinaryContentCreateDto dto){
- return binaryContentRepository.save(dto);
- }
-
- public Optional find(UUID id){
- return binaryContentRepository.findById(id);
- }
-
- public List findAllByIdIn(List idList){
- List fileList = new ArrayList<>();
- for(UUID id : idList){
- if(binaryContentRepository.findById(id).isPresent()) {
- fileList.add(binaryContentRepository.findById(id).get());
- }
- }
- return fileList;
- }
-
- public void delete(UUID id){
- if(!binaryContentRepository.existsById(id)){
- throw new NoSuchElementException("Can't find file");
- }
- binaryContentRepository.deleteById(id);
-
- }
-}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/ReadStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/ReadStatusService.java
deleted file mode 100644
index 9ba0cfa0..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/ReadStatusService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.ReadStatusCreateDto;
-import com.sprint.mission.discodeit.dto.ReadStatusUpdateDto;
-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 lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class ReadStatusService {
- private final ReadStatusRepository readStatusRepository;
- private final UserRepository userRepository;
- private final ChannelRepository channelRepository;
-
- public ReadStatus create(ReadStatusCreateDto dto){
- if(!channelRepository.existsById(dto.channelId())){
- throw new NoSuchElementException("Can't find channel");
- }
- if(!userRepository.existsById(dto.userId())){
- throw new NoSuchElementException("Can't find user");
- }
- if(readStatusRepository.findByChannelAndUser(dto.channelId(), dto.userId()).isPresent()){
- throw new IllegalArgumentException("Already existing read status");
- }
- ReadStatus readStatus = new ReadStatus(dto.userId(), dto.channelId());
- return readStatusRepository.save(readStatus);
- }
-
- public ReadStatus find(UUID id){
- if(readStatusRepository.findById(id).isEmpty()){
- throw new NoSuchElementException("Can't find read status");
- }
- return readStatusRepository.findById(id).get();
- }
-
- public List findAllByUserId(UUID userId){
- return readStatusRepository.findAll().stream()
- .filter(r -> r.getUserId().equals(userId))
- .toList();
- }
-
- public ReadStatus update(ReadStatusUpdateDto dto){
- if(readStatusRepository.findById(dto.id()).isEmpty()){
- throw new NoSuchElementException("Can't find read status");
- }
- ReadStatus readStatus = readStatusRepository.findById(dto.id()).get();
- readStatus.update(dto.isRead());
- return readStatusRepository.save(readStatus);
- }
-
- public void delete(UUID id){
- if(!readStatusRepository.existsById(id)){
- throw new NoSuchElementException("Can't find read status");
- }
- readStatusRepository.deleteById(id);
- }
-
-}
diff --git a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/UserStatusService.java b/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/UserStatusService.java
deleted file mode 100644
index fa2c3e37..00000000
--- a/discodeit/src/main/java/com/sprint/mission/discodeit/service/basic/UserStatusService.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.sprint.mission.discodeit.service.basic;
-
-import com.sprint.mission.discodeit.dto.UserStatusCreateDto;
-import com.sprint.mission.discodeit.dto.UserStatusUpdateDto;
-import com.sprint.mission.discodeit.entity.ReadStatus;
-import com.sprint.mission.discodeit.entity.UserStatus;
-import com.sprint.mission.discodeit.repository.UserRepository;
-import com.sprint.mission.discodeit.repository.UserStatusRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class UserStatusService {
- private final UserStatusRepository userStatusRepository;
- private final UserRepository userRepository;
-
- public UserStatus create(UserStatusCreateDto dto){
- if(!userRepository.existsById(dto.userId())){
- throw new NoSuchElementException("Can't find user");
- }
- if(userStatusRepository.findByUserId(dto.userId()).isPresent()){
- throw new IllegalArgumentException("Already exist");
- }
- UserStatus userStatus = new UserStatus(dto.userId());
- return userStatusRepository.save(userStatus);
- }
-
- public UserStatus find(UUID id){
- return userStatusRepository.findById(id)
- .orElseThrow(() -> new NoSuchElementException("User status with id " + id + " not found"));
- }
-
- public List findAll(){
- return userStatusRepository.findAll();
- }
-
- public UserStatus update(UserStatusUpdateDto dto){
- UserStatus userStatus = userStatusRepository.findById(dto.id())
- .orElseThrow(() -> new NoSuchElementException("User status with id " + dto.id() + " not found"));
- userStatus.update(dto.isOnline());
- return userStatusRepository.save(userStatus);
- }
-
- public UserStatus updateByUserId(UUID userId, UserStatusUpdateDto dto){
- UserStatus userStatus = userStatusRepository.findByUserId(userId)
- .orElseThrow(() -> new NoSuchElementException("User status with id " + userId + " not found"));
- userStatus.update(dto.isOnline());
- return userStatusRepository.save(userStatus);
- }
-
- public void delete(UUID id){
- if(!userStatusRepository.existsById(id)){
- throw new NoSuchElementException("Can't find user status");
- }
- userStatusRepository.deleteById(id);
-
- }
-
-}
diff --git a/discodeit/src/main/resources/application.yaml b/discodeit/src/main/resources/application.yaml
index cc4d919c..c1e5f1d8 100644
--- a/discodeit/src/main/resources/application.yaml
+++ b/discodeit/src/main/resources/application.yaml
@@ -1,8 +1,11 @@
-spring:
- application:
- name: discodeit
+discodeit:
+ repository:
+ type: file # jcf | file
+ file-directory: .discodeit
+
+ servlet:
+ multipart:
+ max-file-size: 10MB # 개별 파일 당 최대 용량 임시 설정
+ max-request-size: 10MB
+
-# discodeit:
-# repository:
-# type: jcf # jcf | file
-# file-directory: .discodeit
diff --git a/discodeit/src/main/resources/static/.DS_Store b/discodeit/src/main/resources/static/.DS_Store
new file mode 100644
index 00000000..5008ddfc
Binary files /dev/null and b/discodeit/src/main/resources/static/.DS_Store differ
diff --git a/discodeit/src/main/resources/static/script.js b/discodeit/src/main/resources/static/script.js
new file mode 100644
index 00000000..e63118b8
--- /dev/null
+++ b/discodeit/src/main/resources/static/script.js
@@ -0,0 +1,67 @@
+// API endpoints
+const API_BASE_URL = '/api';
+const ENDPOINTS = {
+ USERS: `${API_BASE_URL}/user/findAll`,
+ BINARY_CONTENT: `${API_BASE_URL}/binaryContent/find`
+};
+
+// Initialize the application
+document.addEventListener('DOMContentLoaded', () => {
+ fetchAndRenderUsers();
+});
+
+// Fetch users from the API
+async function fetchAndRenderUsers() {
+ try {
+ const response = await fetch(ENDPOINTS.USERS);
+ if (!response.ok) throw new Error('Failed to fetch users');
+ const users = await response.json();
+ renderUserList(users);
+ } catch (error) {
+ console.error('Error fetching users:', error);
+ }
+}
+
+// Fetch user profile image
+async function fetchUserProfile(profileId) {
+ try {
+ const response = await fetch(`${ENDPOINTS.BINARY_CONTENT}?binaryContentId=${profileId}`);
+ if (!response.ok) throw new Error('Failed to fetch profile');
+ const profile = await response.json();
+
+ // Convert base64 encoded bytes to data URL
+ return `data:${profile.contentType};base64,${profile.bytes}`;
+ } catch (error) {
+ console.error('Error fetching profile:', error);
+ return '/default-avatar.png'; // Fallback to default avatar
+ }
+}
+
+// Render user list
+async function renderUserList(users) {
+ const userListElement = document.getElementById('userList');
+ userListElement.innerHTML = ''; // Clear existing content
+
+ for (const user of users) {
+ const userElement = document.createElement('div');
+ userElement.className = 'user-item';
+
+ // Get profile image URL
+ const profileUrl = user.profileId ?
+ await fetchUserProfile(user.profileId) :
+ '/default-avatar.png';
+
+ userElement.innerHTML = `
+
+
+
${user.username}
+
${user.email}
+
+
+ ${user.online ? '온라인' : '오프라인'}
+
+ `;
+
+ userListElement.appendChild(userElement);
+ }
+}
\ No newline at end of file
diff --git a/discodeit/src/main/resources/static/styles.css b/discodeit/src/main/resources/static/styles.css
new file mode 100644
index 00000000..b45f4e70
--- /dev/null
+++ b/discodeit/src/main/resources/static/styles.css
@@ -0,0 +1,80 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: Arial, sans-serif;
+ background-color: #f5f5f5;
+}
+
+.container {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+h1 {
+ text-align: center;
+ margin-bottom: 30px;
+ color: #333;
+}
+
+.user-list {
+ background-color: white;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.user-item {
+ display: flex;
+ align-items: center;
+ padding: 20px;
+ border-bottom: 1px solid #eee;
+}
+
+.user-item:last-child {
+ border-bottom: none;
+}
+
+.user-avatar {
+ width: 60px;
+ height: 60px;
+ border-radius: 50%;
+ margin-right: 20px;
+ object-fit: cover;
+}
+
+.user-info {
+ flex-grow: 1;
+}
+
+.user-name {
+ font-size: 18px;
+ font-weight: bold;
+ color: #333;
+ margin-bottom: 5px;
+}
+
+.user-email {
+ font-size: 14px;
+ color: #666;
+}
+
+.status-badge {
+ padding: 6px 12px;
+ border-radius: 20px;
+ font-size: 14px;
+ font-weight: bold;
+}
+
+.online {
+ background-color: #4CAF50;
+ color: white;
+}
+
+.offline {
+ background-color: #9e9e9e;
+ color: white;
+}
\ No newline at end of file
diff --git a/discodeit/src/main/resources/static/user-list.html b/discodeit/src/main/resources/static/user-list.html
new file mode 100644
index 00000000..f3acfdb5
--- /dev/null
+++ b/discodeit/src/main/resources/static/user-list.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+ 사용자 목록
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/file-data-map/BinaryContent/1e6fa1ed-bc88-45a9-b704-7c105bcffece.ser b/file-data-map/BinaryContent/1e6fa1ed-bc88-45a9-b704-7c105bcffece.ser
deleted file mode 100644
index a4a3d8f0..00000000
Binary files a/file-data-map/BinaryContent/1e6fa1ed-bc88-45a9-b704-7c105bcffece.ser and /dev/null differ
diff --git a/file-data-map/Channel/bb4d73bf-b380-4224-9d8a-74ee7696701f.ser b/file-data-map/Channel/bb4d73bf-b380-4224-9d8a-74ee7696701f.ser
deleted file mode 100644
index 05c2359b..00000000
Binary files a/file-data-map/Channel/bb4d73bf-b380-4224-9d8a-74ee7696701f.ser and /dev/null differ
diff --git a/file-data-map/Channel/dbc4a16b-e633-4598-a8c2-f94f8a619d1a.ser b/file-data-map/Channel/dbc4a16b-e633-4598-a8c2-f94f8a619d1a.ser
deleted file mode 100644
index a14917ee..00000000
Binary files a/file-data-map/Channel/dbc4a16b-e633-4598-a8c2-f94f8a619d1a.ser and /dev/null differ
diff --git a/file-data-map/Message/dc6c984f-417e-4c66-8a0e-6634e402f5b2.ser b/file-data-map/Message/dc6c984f-417e-4c66-8a0e-6634e402f5b2.ser
deleted file mode 100644
index f6b4fc32..00000000
Binary files a/file-data-map/Message/dc6c984f-417e-4c66-8a0e-6634e402f5b2.ser and /dev/null differ
diff --git a/file-data-map/Message/e8ca20e3-41e7-41e6-a6c3-4d80039d226d.ser b/file-data-map/Message/e8ca20e3-41e7-41e6-a6c3-4d80039d226d.ser
deleted file mode 100644
index ac1cb480..00000000
Binary files a/file-data-map/Message/e8ca20e3-41e7-41e6-a6c3-4d80039d226d.ser and /dev/null differ
diff --git a/file-data-map/ReadStatus/4b185178-2527-4329-a613-96466064a7c4.ser b/file-data-map/ReadStatus/4b185178-2527-4329-a613-96466064a7c4.ser
deleted file mode 100644
index 7dd75b2b..00000000
Binary files a/file-data-map/ReadStatus/4b185178-2527-4329-a613-96466064a7c4.ser and /dev/null differ
diff --git a/file-data-map/User/4b33ccf0-c98e-4d93-a727-eda586e61b87.ser b/file-data-map/User/4b33ccf0-c98e-4d93-a727-eda586e61b87.ser
deleted file mode 100644
index c8dbaadc..00000000
Binary files a/file-data-map/User/4b33ccf0-c98e-4d93-a727-eda586e61b87.ser and /dev/null differ
diff --git a/file-data-map/UserStatus/69b3a48f-ae63-4570-bf05-f3c025639f6a.ser b/file-data-map/UserStatus/69b3a48f-ae63-4570-bf05-f3c025639f6a.ser
deleted file mode 100644
index 547539d8..00000000
Binary files a/file-data-map/UserStatus/69b3a48f-ae63-4570-bf05-f3c025639f6a.ser and /dev/null differ