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.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