diff --git a/build.gradle b/build.gradle index 02d330325..164060d19 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,37 @@ plugins { id 'groovy' id 'checkstyle' + id 'java' + id 'org.springframework.boot' version '3.4.2' + id 'io.spring.dependency-management' version '1.1.7' } group 'com.sprint.mission' version '1.0-SNAPSHOT' +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + repositories { mavenCentral() } dependencies { - implementation 'org.apache.groovy:groovy:4.0.14' - implementation 'org.projectlombok:lombok:1.18.30' // 최신 버전 사용 - annotationProcessor 'org.projectlombok:lombok:1.18.30' // Lombok 애노테이션 프로세서 추가 - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' - // https://mvnrepository.com/artifact/com.google.guava/guava - implementation 'com.google.guava:guava:33.2.1-jre' - // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind + implementation 'org.springframework.boot:spring-boot-starter-web' // Spring Web 추가 + implementation 'org.springframework.boot:spring-boot-starter' + + implementation 'org.projectlombok:lombok:1.18.30' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + annotationProcessor 'org.projectlombok:lombok:1.18.30' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.2' + + implementation 'com.google.guava:guava:33.2.1-jre' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { diff --git a/config/channel.ser b/config/channel.ser deleted file mode 100644 index 2ccf0c8cf..000000000 Binary files a/config/channel.ser and /dev/null differ diff --git a/config/message.ser b/config/message.ser deleted file mode 100644 index c4360ac53..000000000 Binary files a/config/message.ser and /dev/null differ diff --git a/config/user.ser b/config/user.ser index 93f89dc49..9776724fd 100644 Binary files a/config/user.ser and b/config/user.ser differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee..040f043bb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +#distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 3b3347e7f..7825fd699 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -1,333 +1,114 @@ package com.sprint.mission.discodeit; -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.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; -import com.sprint.mission.discodeit.service.*; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; - -import java.util.*; - - +import com.sprint.mission.discodeit.domain.ChannelType; +import com.sprint.mission.discodeit.dto.*; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.AuthService; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.UserService; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +import java.util.ArrayList; +import java.util.List; + +@SpringBootApplication public class DiscodeitApplication { - static List setupUser(UserService userService) { - List users = List.of( - new User("JohnDoe", "john.doe@example.com", "010-1234-5678", "Seoul, Korea", 30, "Reading", new ArrayList<>(List.of("Technology", "Gaming"))), - new User("JaneDoe", "jane.doe@example.com", "010-5678-1234", "Busan, Korea", 28, "Traveling", new ArrayList<>(List.of("Photography", "Hiking"))), - new User("Alice", "alice.wonderland@example.com", "010-8765-4321", "Incheon, Korea", 25, "Painting", new ArrayList<>(List.of("Art", "Design"))), - new User("Bob", "bob.builder@example.com", "010-4321-8765", "Daegu, Korea", 35, "Building", new ArrayList<>(List.of("Construction", "DIY Projects"))), - new User("Charlie", "charlie.choco@example.com", "010-5678-9876", "Jeju, Korea", 27, "Cooking", new ArrayList<>(List.of("Food", "Baking"))) + static List setupUser(UserService userService) { + List users = List.of( + new UserRequest("JohnDoe", "P@ssw0rd1", "john.doe@example.com", "010-1234-5678",null), + new UserRequest("JaneDoe", "P@ssw0rd2", "jane.doe@example.com", "010-5678-1234",null), + new UserRequest("Alice", "P@ssw0rd3", "alice.wonderland@example.com", "010-8765-4321", null), + new UserRequest("Bob", "P@ssw0rd4", "bob.builder@example.com", "010-4321-8765", null), + new UserRequest("Charlie", "P@ssw0rd5", "charlie.choco@example.com", "010-5678-9876", null) ); - for (User user : users) { + for (UserRequest user : users) { userService.create(user); } return users; } - - private static final String DATA_NULL_BLANK = ""; public static void main(String[] args) { - UserRepository jcfUserRepo = new JCFUserRepository(); - UserRepository fileUserRepo = new FileUserRepository(); + ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); - System.out.println("====== 유저 jcf repo ====="); - UserService userService = new BasicUserService(jcfUserRepo); + UserService userService = context.getBean(UserService.class); + AuthService authService = context.getBean(AuthService.class); + ChannelService channelService = context.getBean(ChannelService.class); - System.out.println("================"); - System.out.println("JCF 유저 셋팅"); - List setUserList = setupUser(userService); + setupUser(userService); - System.out.println("================"); - System.out.println("JCF 유저 모두 읽기"); - List jcfUserList = userService.readAll(); - jcfUserList.forEach(user -> { - System.out.println("userName : " + user.getUsername() - + " | Email : " + user.getEmail() - + " | phoneNumber : " + user.getPhoneNumber() - + " | Address : " + user.getAddr() - + " | Age : " + user.getAge() - + " | Hobby : " + user.getHobby() - + " | Interest : " + user.getInterest() + System.out.println("==== User Read All ===="); + List users = userService.readAll(); + users.forEach(user -> { + System.out.println("userName : " + user.username() + + " | Email : " + user.email() + + " | phoneNumber : " + user.phoneNumber() + + " | isOnline : " + user.isOnline() ); }); - System.out.println("================"); - System.out.println("JCF User 'Bob' search"); - User jcfUserOne = jcfUserList.stream() - .filter(user -> user.getUsername().equals("Bob")) - .findFirst() - .orElse(null); - - System.out.println("userName : " + jcfUserOne.getUsername() - + " | Email : " + jcfUserOne.getEmail() - + " | phoneNumber : " + jcfUserOne.getPhoneNumber() - + " | Address : " + jcfUserOne.getAddr() - + " | Age : " + jcfUserOne.getAge() - + " | Hobby : " + jcfUserOne.getHobby() - + " | Interest : " + jcfUserOne.getInterest() - ); - - System.out.println("================"); - System.out.println("JCF User 'Bob' update"); - userService.update(jcfUserOne.getId(), new User("Bob", "updated_user1@example.com", "010-2349-9548", "Seoul, Korea", 35, "Reading2", new ArrayList<>(List.of("Construction","Technology", "Gaming")))); - jcfUserOne = userService.readOne(jcfUserOne.getId()); - - System.out.println("userName : " + jcfUserOne.getUsername() - + " | Email : " + jcfUserOne.getEmail() - + " | phoneNumber : " + jcfUserOne.getPhoneNumber() - + " | Address : " + jcfUserOne.getAddr() - + " | Age : " + jcfUserOne.getAge() - + " | Hobby : " + jcfUserOne.getHobby() - + " | Interest : " + jcfUserOne.getInterest() + System.out.println("==== User 2 Read ===="); + UserResponse findUser = userService.readOne(users.get(2).id()); + System.out.println("userName : " + findUser.username() + + " | Email : " + findUser.email() + + " | phoneNumber : " + findUser.phoneNumber() + + " | isOnline : " + findUser.isOnline() ); - System.out.println(); - System.out.println("====== 유저 file Repo 교체 ====="); - userService = new BasicUserService(fileUserRepo); +// System.out.println("==== User 2 Delete ===="); +// userService.delete(users.get(2).id()); - System.out.println("================"); - System.out.println("File 유저 셋팅"); - for(User user : setUserList){ - userService.create(user); - } -// setupUser(userService); - - List fileUserList = userService.readAll(); - fileUserList.forEach(user -> { - System.out.println("userName : " + user.getUsername() - + " | Email : " + user.getEmail() - + " | phoneNumber : " + user.getPhoneNumber() - + " | Address : " + user.getAddr() - + " | Age : " + user.getAge() - + " | Hobby : " + user.getHobby() - + " | Interest : " + user.getInterest() - ); - }); - - System.out.println("================"); - System.out.println("File User 'Bob' search"); - User fileUserOne = fileUserList.stream() - .filter(user -> user.getUsername().equals("Bob")) - .findFirst() - .orElse(null); + System.out.println("==== User 1 Update ===="); + UserResponse updateUser = userService.update(users.get(1).id(), new UserRequest("martin", "3ksp21","martin@codeit.com", "010-2323-2323",null)); - System.out.println("userName : " + fileUserOne.getUsername() - + " | Email : " + fileUserOne.getEmail() - + " | phoneNumber : " + fileUserOne.getPhoneNumber() - + " | Address : " + fileUserOne.getAddr() - + " | Age : " + fileUserOne.getAge() - + " | Hobby : " + fileUserOne.getHobby() - + " | Interest : " + fileUserOne.getInterest() - ); + authService.login("alice.wonderland@example.com","P@ssw0rd3"); + authService.login("bob.builder@example.com", "123123"); - System.out.println("================"); - System.out.println("File User 'Bob' update"); - userService.update(fileUserOne.getId(), new User("Bob", "updated_user1@example.com", "010-2349-9548", "Seoul, Korea", 35, "Reading2", new ArrayList<>(List.of("Construction","Technology", "Gaming")))); - fileUserOne = userService.readOne(fileUserOne.getId()); - System.out.println("userName : " + fileUserOne.getUsername() - + " | Email : " + fileUserOne.getEmail() - + " | phoneNumber : " + fileUserOne.getPhoneNumber() - + " | Address : " + fileUserOne.getAddr() - + " | Age : " + fileUserOne.getAge() - + " | Hobby : " + fileUserOne.getHobby() - + " | Interest : " + fileUserOne.getInterest() - ); - - System.out.println("================"); - System.out.println("File User 'Bob' delete"); - userService.delete(fileUserOne.getId()); - fileUserList = userService.readAll(); - fileUserList.forEach(user -> { - System.out.println("userName : " + user.getUsername() - + " | Email : " + user.getEmail() - + " | phoneNumber : " + user.getPhoneNumber() - + " | Address : " + user.getAddr() - + " | Age : " + user.getAge() - + " | Hobby : " + user.getHobby() - + " | Interest : " + user.getInterest() - ); - }); - - - - System.out.println(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>Channel>>>>>>>>>>>>>>>>>>>>>>>"); - List channels = List.of( - new Channel("SB_1_Sprint", "JAVA Spring BackEnd Developer discode", - new ArrayList<>(List.of(jcfUserList.get(0), jcfUserList.get(1))), jcfUserList.get(1)), - new Channel("JavaScript_TechTalk", "All about JavaScript and its frameworks", - new ArrayList<>(List.of(jcfUserList.get(1), jcfUserList.get(2))), jcfUserList.get(2)), - new Channel("React_FrontEnd", "Front-end technologies focusing on React", - new ArrayList<>(List.of(jcfUserList.get(3), jcfUserList.get(4))), jcfUserList.get(4)), - new Channel("NodeJS_DevGroup", "Node.js development and deployment discussions", - new ArrayList<>(List.of(jcfUserList.get(0), jcfUserList.get(2))), jcfUserList.get(0)), - new Channel("SpringBoot_Dev", "Discussions on SpringBoot applications and microservices", - new ArrayList<>(List.of(jcfUserList.get(1), jcfUserList.get(4))), jcfUserList.get(1)) + List channels = List.of( + new ChannelRequest("SB_1_Sprint", "JAVA Spring BackEnd Developer discode", + new ArrayList<>(List.of(users.get(0).id(), users.get(1).id())), users.get(1).id(), ChannelType.Private), + new ChannelRequest("JavaScript_TechTalk", "All about JavaScript and its frameworks", + new ArrayList<>(), users.get(2).id(), ChannelType.Public), + new ChannelRequest("React_FrontEnd", "Front-end technologies focusing on React", + new ArrayList<>(List.of(users.get(3).id(), users.get(4).id())), users.get(4).id(), ChannelType.Private), + new ChannelRequest("NodeJS_DevGroup", "Node.js development and deployment discussions", + new ArrayList<>(), users.get(0).id(),ChannelType.Public), + new ChannelRequest("SpringBoot_Dev", "Discussions on SpringBoot applications and microservices", + new ArrayList<>(List.of(users.get(1).id(), users.get(4).id())), users.get(1).id(), ChannelType.Private) ); - System.out.println(); - System.out.println("================"); - System.out.println("JCF 채널 셋팅"); - ChannelRepository jcfChannelRepo = new JCFChannelRepository(); - ChannelService channelService = new BasicChannelService(jcfChannelRepo); - for(Channel channel : channels){ - channelService.create(channel); - } - System.out.println("채널 등록 완료"); - System.out.println("================"); + channels.forEach(channel -> channelService.create(channel)); - System.out.println("================"); - System.out.println("JCF 전체 채널 조회 :"); - List jcfChannelList = channelService.readAll(); - jcfChannelList.forEach(channel -> { - System.out.println("name : " + channel.getName() - + " | Owner : " + channel.getOwner().getUsername() - + " | description : " + channel.getDescription() - ); - }); - - - System.out.println("JCF User 'JavaScript_TechTalk' search"); - Channel jcfChannelOne = jcfChannelList.stream() - .filter(channel -> channel.getName().equals("JavaScript_TechTalk")) - .findFirst() - .orElse(null); - - System.out.println(jcfChannelOne.getName()); - -// Channel channel1 = channels.get(1); -// -// User addUser = new User("martin", "martin@example.com", "010-5678-5678", "Seoul, Korea", 30, "Reading", new ArrayList<>(List.of("Technology", "computer"))); -// userService.create(addUser); -// System.out.println("================"); -// -// System.out.println("채널에 새로운 맴버 추가하기 : "); -// channelService.channelMemberJoin(channel1.getId(), addUser); -// System.out.println("================"); -// -// System.out.println("채널 주인장 변경하기 :"); -// channelService.channelOwnerChange(channel1.getId(), users.get(1)); -// System.out.println("================"); - - - System.out.println(); - System.out.println("================"); - System.out.println("File 채널 셋팅"); - - ChannelRepository fileChannelRepo = new FileChannelRepository(); - channelService = new BasicChannelService(fileChannelRepo); - - for(Channel channel : channels){ - channelService.create(channel); - } - System.out.println("채널 등록 완료"); - System.out.println("================"); - - System.out.println("================"); - System.out.println("File 전체 채널 조회 :"); - List fileChannelList = channelService.readAll(); - fileChannelList.forEach(channel -> { - System.out.println("name : " + channel.getName() - + " | Owner : " + channel.getOwner().getUsername() - + " | description : " + channel.getDescription() - ); - }); - - MessageRepository jcfMessageRepo = new JCFMessageRepository(); - MessageService messageService = new BasicMessageService(jcfMessageRepo); - System.out.println(); - System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>Message>>>>>>>>>>>>>>>>>>>>>>>"); - - List messages = List.of( - new Message("Hello", jcfUserList.get(1), jcfUserList.get(4)), - new Message("처음 뵙겠습니다~", jcfUserList.get(1), channels.get(1)), - new Message("안녕하세요!", jcfUserList.get(2), channels.get(0)), - new Message("채널 가입 요청 드립니다.", jcfUserList.get(3), channels.get(2)), - new Message("반가워요!", jcfUserList.get(1), jcfUserList.get(3)), - new Message("공지사항 확인 부탁드립니다.", jcfUserList.get(0), channels.get(3)), - new Message("다음 모임은 언제인가요?", jcfUserList.get(4), channels.get(1)), - new Message("메일 보내드렸습니다.", jcfUserList.get(2), jcfUserList.get(0)), - new Message("새 프로젝트에 대해서 논의해보아요.", jcfUserList.get(3), channels.get(4)), - new Message("다른 문의사항 있으면 알려주세요.", jcfUserList.get(2), channels.get(0)) - ); - - messages.forEach(message -> { - messageService.create(message); - }); - - System.out.println("메시지 전송 완료"); - System.out.println("================"); - - System.out.println("전체 메시지 조회 : "); - List messageList = messageService.readAll(); - messageList.forEach(message -> { - String sender = message.getSender().getUsername(); - String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK ; - - if(recipient != DATA_NULL_BLANK){ - System.out.println(sender + "님이 " + recipient + "님에게 글을 남기셨습니다."); - System.out.println(sender + " -> " + recipient + " : " + message.getContent()); + List channelList = channelService.readAll(); + channelList.forEach(channel -> { + if(channel.channelType() == ChannelType.Private){ + System.out.println("Private Channel"); }else{ - System.out.println(sender + "님이 " + message.getChannel().getName() + " 채널에 글을 남기셨습니다."); - System.out.println(sender + " - " + message.getContent()); + System.out.println("channelName : " + channel.name() + + " | description : " + channel.description() + ); } - }); - System.out.println("================"); - -// System.out.println(channels.get(1).getName() + " 채널 전체 메시지 조회 : "); -// List cMList = messageService.readAll(channels.get(1).getId()); -// cMList.forEach(message -> { -// String sender = message.getSender().getUsername(); -// String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK; -// -// if (recipient != DATA_NULL_BLANK) { -// System.out.println(sender + " -> " + recipient + " : " + message.getContent()); -// } else { -// System.out.println(sender + " - " + message.getContent()); -// } -// }); - - System.out.println(); - System.out.println("================"); - System.out.println("File 채널 셋팅"); - MessageRepository fileMessageRepo = new FileMessageRepository(); - MessageService fMessageService = new BasicMessageService(fileMessageRepo); - - for(Message message : messages){ - fMessageService.create(message); - } - System.out.println("메시지 등록 완료"); - System.out.println("================"); - - System.out.println("전체 메시지 조회 : "); - messageList = fMessageService.readAll(); - messageList.forEach(message -> { - String sender = message.getSender().getUsername(); - String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK ; - - if(recipient != DATA_NULL_BLANK){ - System.out.println(sender + "님이 " + recipient + "님에게 글을 남기셨습니다."); - System.out.println(sender + " -> " + recipient + " : " + message.getContent()); - }else{ - System.out.println(sender + "님이 " + message.getChannel().getName() + " 채널에 글을 남기셨습니다."); - System.out.println(sender + " - " + message.getContent()); - } }); - System.out.println("================"); - - +// System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>Message>>>>>>>>>>>>>>>>>>>>>>>"); +// +// List messages = List.of( +// new MessageResponse("Hello", users.get(1), users.get(4)), +// new MessageResponse("처음 뵙겠습니다~", users.get(1), channels.get(1)), +// new MessageResponse("안녕하세요!", users.get(2), channels.get(0)), +// new MessageResponse("채널 가입 요청 드립니다.", users.get(3), channels.get(2)), +// new MessageResponse("반가워요!", users.get(1), users.get(3)), +// new MessageResponse("공지사항 확인 부탁드립니다.", users.get(0), channels.get(3)), +// new MessageResponse("다음 모임은 언제인가요?", users.get(4), channels.get(1)), +// new MessageResponse("메일 보내드렸습니다.", users.get(2), users.get(0)), +// new MessageResponse("새 프로젝트에 대해서 논의해보아요.", users.get(3), channels.get(4)), +// new MessageResponse("다른 문의사항 있으면 알려주세요.", users.get(2), channels.get(0)) +// ); } } diff --git a/src/main/java/com/sprint/mission/discodeit/_DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/_DiscodeitApplication.java new file mode 100644 index 000000000..4ca56c7fc --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/_DiscodeitApplication.java @@ -0,0 +1,333 @@ +//package com.sprint.mission.discodeit; +// +//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.UserRepository; +//import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +//import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +//import com.sprint.mission.discodeit.repository.file.FileUserRepository; +//import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; +//import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; +//import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; +//import com.sprint.mission.discodeit.service.*; +//import com.sprint.mission.discodeit.service.basic.BasicChannelService; +//import com.sprint.mission.discodeit.service.basic.BasicMessageService; +//import com.sprint.mission.discodeit.service.basic.BasicUserService; +// +//import java.util.*; +// +// +//public class _DiscodeitApplication { +// static List setupUser(UserService userService) { +// List users = List.of( +// new User("JohnDoe", "john.doe@example.com", "010-1234-5678", "Seoul, Korea", 30, "Reading", new ArrayList<>(List.of("Technology", "Gaming"))), +// new User("JaneDoe", "jane.doe@example.com", "010-5678-1234", "Busan, Korea", 28, "Traveling", new ArrayList<>(List.of("Photography", "Hiking"))), +// new User("Alice", "alice.wonderland@example.com", "010-8765-4321", "Incheon, Korea", 25, "Painting", new ArrayList<>(List.of("Art", "Design"))), +// new User("Bob", "bob.builder@example.com", "010-4321-8765", "Daegu, Korea", 35, "Building", new ArrayList<>(List.of("Construction", "DIY Projects"))), +// new User("Charlie", "charlie.choco@example.com", "010-5678-9876", "Jeju, Korea", 27, "Cooking", new ArrayList<>(List.of("Food", "Baking"))) +// ); +// +// for (User user : users) { +// userService.create(user); +// } +// return users; +// } +// +// private static final String DATA_NULL_BLANK = ""; +// public static void main(String[] args) { +// UserRepository jcfUserRepo = new JCFUserRepository(); +// UserRepository fileUserRepo = new FileUserRepository(); +// +// System.out.println("====== 유저 jcf repo ====="); +// UserService userService = new BasicUserService(jcfUserRepo); +// +// System.out.println("================"); +// System.out.println("JCF 유저 셋팅"); +// List setUserList = setupUser(userService); +// +// System.out.println("================"); +// System.out.println("JCF 유저 모두 읽기"); +// List jcfUserList = userService.readAll(); +// jcfUserList.forEach(user -> { +// System.out.println("userName : " + user.getUsername() +// + " | Email : " + user.getEmail() +// + " | phoneNumber : " + user.getPhoneNumber() +// + " | Address : " + user.getAddr() +// + " | Age : " + user.getAge() +// + " | Hobby : " + user.getHobby() +// + " | Interest : " + user.getInterest() +// ); +// }); +// +// System.out.println("================"); +// System.out.println("JCF User 'Bob' search"); +// User jcfUserOne = jcfUserList.stream() +// .filter(user -> user.getUsername().equals("Bob")) +// .findFirst() +// .orElse(null); +// +// System.out.println("userName : " + jcfUserOne.getUsername() +// + " | Email : " + jcfUserOne.getEmail() +// + " | phoneNumber : " + jcfUserOne.getPhoneNumber() +// + " | Address : " + jcfUserOne.getAddr() +// + " | Age : " + jcfUserOne.getAge() +// + " | Hobby : " + jcfUserOne.getHobby() +// + " | Interest : " + jcfUserOne.getInterest() +// ); +// +// System.out.println("================"); +// System.out.println("JCF User 'Bob' update"); +// userService.update(jcfUserOne.getId(), new User("Bob", "P@ssw0rdB0b", "updated_user1@example.com", "010-2349-9548", "Seoul, Korea", 35, "Reading2", new ArrayList<>(List.of("Construction","Technology", "Gaming")))); +// jcfUserOne = userService.readOne(jcfUserOne.getId()); +// +// System.out.println("userName : " + jcfUserOne.getUsername() +// + " | Email : " + jcfUserOne.getEmail() +// + " | phoneNumber : " + jcfUserOne.getPhoneNumber() +// + " | Address : " + jcfUserOne.getAddr() +// + " | Age : " + jcfUserOne.getAge() +// + " | Hobby : " + jcfUserOne.getHobby() +// + " | Interest : " + jcfUserOne.getInterest() +// ); +// +// System.out.println(); +// System.out.println("====== 유저 file Repo 교체 ====="); +// userService = new BasicUserService(fileUserRepo); +// +// System.out.println("================"); +// System.out.println("File 유저 셋팅"); +// for(User user : setUserList){ +// userService.create(user); +// } +//// setupUser(userService); +// +// List fileUserList = userService.readAll(); +// fileUserList.forEach(user -> { +// System.out.println("userName : " + user.getUsername() +// + " | Email : " + user.getEmail() +// + " | phoneNumber : " + user.getPhoneNumber() +// + " | Address : " + user.getAddr() +// + " | Age : " + user.getAge() +// + " | Hobby : " + user.getHobby() +// + " | Interest : " + user.getInterest() +// ); +// }); +// +// System.out.println("================"); +// System.out.println("File User 'Bob' search"); +// User fileUserOne = fileUserList.stream() +// .filter(user -> user.getUsername().equals("Bob")) +// .findFirst() +// .orElse(null); +// +// System.out.println("userName : " + fileUserOne.getUsername() +// + " | Email : " + fileUserOne.getEmail() +// + " | phoneNumber : " + fileUserOne.getPhoneNumber() +// + " | Address : " + fileUserOne.getAddr() +// + " | Age : " + fileUserOne.getAge() +// + " | Hobby : " + fileUserOne.getHobby() +// + " | Interest : " + fileUserOne.getInterest() +// ); +// +// +// System.out.println("================"); +// System.out.println("File User 'Bob' update"); +// userService.update(fileUserOne.getId(), new User("Bob", "updated_user1@example.com", "010-2349-9548", "Seoul, Korea", 35, "Reading2", new ArrayList<>(List.of("Construction","Technology", "Gaming")))); +// fileUserOne = userService.readOne(fileUserOne.getId()); +// +// System.out.println("userName : " + fileUserOne.getUsername() +// + " | Email : " + fileUserOne.getEmail() +// + " | phoneNumber : " + fileUserOne.getPhoneNumber() +// + " | Address : " + fileUserOne.getAddr() +// + " | Age : " + fileUserOne.getAge() +// + " | Hobby : " + fileUserOne.getHobby() +// + " | Interest : " + fileUserOne.getInterest() +// ); +// +// System.out.println("================"); +// System.out.println("File User 'Bob' delete"); +// userService.delete(fileUserOne.getId()); +// fileUserList = userService.readAll(); +// fileUserList.forEach(user -> { +// System.out.println("userName : " + user.getUsername() +// + " | Email : " + user.getEmail() +// + " | phoneNumber : " + user.getPhoneNumber() +// + " | Address : " + user.getAddr() +// + " | Age : " + user.getAge() +// + " | Hobby : " + user.getHobby() +// + " | Interest : " + user.getInterest() +// ); +// }); +// +// +// +// System.out.println(); +// System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>Channel>>>>>>>>>>>>>>>>>>>>>>>"); +// List channels = List.of( +// new Channel("SB_1_Sprint", "JAVA Spring BackEnd Developer discode", +// new ArrayList<>(List.of(jcfUserList.get(0), jcfUserList.get(1))), jcfUserList.get(1)), +// new Channel("JavaScript_TechTalk", "All about JavaScript and its frameworks", +// new ArrayList<>(List.of(jcfUserList.get(1), jcfUserList.get(2))), jcfUserList.get(2)), +// new Channel("React_FrontEnd", "Front-end technologies focusing on React", +// new ArrayList<>(List.of(jcfUserList.get(3), jcfUserList.get(4))), jcfUserList.get(4)), +// new Channel("NodeJS_DevGroup", "Node.js development and deployment discussions", +// new ArrayList<>(List.of(jcfUserList.get(0), jcfUserList.get(2))), jcfUserList.get(0)), +// new Channel("SpringBoot_Dev", "Discussions on SpringBoot applications and microservices", +// new ArrayList<>(List.of(jcfUserList.get(1), jcfUserList.get(4))), jcfUserList.get(1)) +// ); +// System.out.println(); +// System.out.println("================"); +// System.out.println("JCF 채널 셋팅"); +// +// ChannelRepository jcfChannelRepo = new JCFChannelRepository(); +// ChannelService channelService = new BasicChannelService(jcfChannelRepo); +// +// for(Channel channel : channels){ +// channelService.create(channel); +// } +// System.out.println("채널 등록 완료"); +// System.out.println("================"); +// +// System.out.println("================"); +// System.out.println("JCF 전체 채널 조회 :"); +// List jcfChannelList = channelService.readAll(); +// jcfChannelList.forEach(channel -> { +// System.out.println("name : " + channel.getName() +// + " | Owner : " + channel.getOwner().getUsername() +// + " | description : " + channel.getDescription() +// ); +// }); +// +// +// System.out.println("JCF User 'JavaScript_TechTalk' search"); +// Channel jcfChannelOne = jcfChannelList.stream() +// .filter(channel -> channel.getName().equals("JavaScript_TechTalk")) +// .findFirst() +// .orElse(null); +// +// System.out.println(jcfChannelOne.getName()); +// +//// Channel channel1 = channels.get(1); +//// +//// User addUser = new User("martin", "martin@example.com", "010-5678-5678", "Seoul, Korea", 30, "Reading", new ArrayList<>(List.of("Technology", "computer"))); +//// userService.create(addUser); +//// System.out.println("================"); +//// +//// System.out.println("채널에 새로운 맴버 추가하기 : "); +//// channelService.channelMemberJoin(channel1.getId(), addUser); +//// System.out.println("================"); +//// +//// System.out.println("채널 주인장 변경하기 :"); +//// channelService.channelOwnerChange(channel1.getId(), users.get(1)); +//// System.out.println("================"); +// +// +// System.out.println(); +// System.out.println("================"); +// System.out.println("File 채널 셋팅"); +// +// ChannelRepository fileChannelRepo = new FileChannelRepository(); +// channelService = new BasicChannelService(fileChannelRepo); +// +// for(Channel channel : channels){ +// channelService.create(channel); +// } +// System.out.println("채널 등록 완료"); +// System.out.println("================"); +// +// System.out.println("================"); +// System.out.println("File 전체 채널 조회 :"); +// List fileChannelList = channelService.readAll(); +// fileChannelList.forEach(channel -> { +// System.out.println("name : " + channel.getName() +// + " | Owner : " + channel.getOwner().getUsername() +// + " | description : " + channel.getDescription() +// ); +// }); +// +// MessageRepository jcfMessageRepo = new JCFMessageRepository(); +// MessageService messageService = new BasicMessageService(jcfMessageRepo); +// System.out.println(); +// System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>Message>>>>>>>>>>>>>>>>>>>>>>>"); +// +// List messages = List.of( +// new Message("Hello", jcfUserList.get(1), jcfUserList.get(4)), +// new Message("처음 뵙겠습니다~", jcfUserList.get(1), channels.get(1)), +// new Message("안녕하세요!", jcfUserList.get(2), channels.get(0)), +// new Message("채널 가입 요청 드립니다.", jcfUserList.get(3), channels.get(2)), +// new Message("반가워요!", jcfUserList.get(1), jcfUserList.get(3)), +// new Message("공지사항 확인 부탁드립니다.", jcfUserList.get(0), channels.get(3)), +// new Message("다음 모임은 언제인가요?", jcfUserList.get(4), channels.get(1)), +// new Message("메일 보내드렸습니다.", jcfUserList.get(2), jcfUserList.get(0)), +// new Message("새 프로젝트에 대해서 논의해보아요.", jcfUserList.get(3), channels.get(4)), +// new Message("다른 문의사항 있으면 알려주세요.", jcfUserList.get(2), channels.get(0)) +// ); +// +// messages.forEach(message -> { +// messageService.create(message); +// }); +// +// System.out.println("메시지 전송 완료"); +// System.out.println("================"); +// +// System.out.println("전체 메시지 조회 : "); +// List messageList = messageService.readAll(); +// messageList.forEach(message -> { +// String sender = message.getSender().getUsername(); +// String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK ; +// +// if(recipient != DATA_NULL_BLANK){ +// System.out.println(sender + "님이 " + recipient + "님에게 글을 남기셨습니다."); +// System.out.println(sender + " -> " + recipient + " : " + message.getContent()); +// }else{ +// System.out.println(sender + "님이 " + message.getChannel().getName() + " 채널에 글을 남기셨습니다."); +// System.out.println(sender + " - " + message.getContent()); +// } +// }); +// System.out.println("================"); +// +//// System.out.println(channels.get(1).getName() + " 채널 전체 메시지 조회 : "); +//// List cMList = messageService.readAll(channels.get(1).getId()); +//// cMList.forEach(message -> { +//// String sender = message.getSender().getUsername(); +//// String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK; +//// +//// if (recipient != DATA_NULL_BLANK) { +//// System.out.println(sender + " -> " + recipient + " : " + message.getContent()); +//// } else { +//// System.out.println(sender + " - " + message.getContent()); +//// } +//// }); +// +// System.out.println(); +// System.out.println("================"); +// System.out.println("File 채널 셋팅"); +// +// MessageRepository fileMessageRepo = new FileMessageRepository(); +// MessageService fMessageService = new BasicMessageService(fileMessageRepo); +// +// for(Message message : messages){ +// fMessageService.create(message); +// } +// System.out.println("메시지 등록 완료"); +// System.out.println("================"); +// +// System.out.println("전체 메시지 조회 : "); +// messageList = fMessageService.readAll(); +// messageList.forEach(message -> { +// String sender = message.getSender().getUsername(); +// String recipient = message.getRecipient() != null ? message.getRecipient().getUsername() : DATA_NULL_BLANK ; +// +// if(recipient != DATA_NULL_BLANK){ +// System.out.println(sender + "님이 " + recipient + "님에게 글을 남기셨습니다."); +// System.out.println(sender + " -> " + recipient + " : " + message.getContent()); +// }else{ +// System.out.println(sender + "님이 " + message.getChannel().getName() + " 채널에 글을 남기셨습니다."); +// System.out.println(sender + " - " + message.getContent()); +// } +// }); +// System.out.println("================"); +// +// +// } +//} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/domain/ChannelType.java new file mode 100644 index 000000000..fa17adbee --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/ChannelType.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.domain; + +public enum ChannelType { + Private, Public; +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Mimetype.java b/src/main/java/com/sprint/mission/discodeit/domain/Mimetype.java new file mode 100644 index 000000000..7177603b9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/Mimetype.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.domain; + +public enum Mimetype { + User, Message; +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelRequest.java new file mode 100644 index 000000000..5465cc240 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/ChannelRequest.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.domain.ChannelType; + +import java.util.List; +import java.util.UUID; + +public record ChannelRequest( + String name, + String description, + List member, + UUID owner, + ChannelType channelType +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelResponse.java new file mode 100644 index 000000000..1cdfcd9a5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/ChannelResponse.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.domain.ChannelType; +import com.sprint.mission.discodeit.entity.Channel; + +import javax.naming.directory.NoSuchAttributeException; +import java.util.List; +import java.util.UUID; + +public record ChannelResponse( + String name, + String description, + List member, + UUID owner, + ChannelType channelType +) { + public static ChannelResponse fromEntity(Channel channel){ + return new ChannelResponse( + channel.getName(), + channel.getDescription(), + channel.getMember(), + channel.getOwner(), + channel.getChannelType() + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageRequest.java new file mode 100644 index 000000000..0602fa7e8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/MessageRequest.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.dto; + +import java.util.UUID; + +public record MessageRequest( + String content, + UUID senderId, + UUID recipientId, + UUID channelId, + UUID attachedFileId +) { + + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageResponse.java new file mode 100644 index 000000000..879a43afa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/MessageResponse.java @@ -0,0 +1,21 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.entity.Message; + +import java.util.UUID; + +public record MessageResponse( + String content, + UUID senderId, + UUID recipientId, + UUID channelId +) { + public static MessageResponse fromEntity(Message message){ + return new MessageResponse( + message.getContent(), + message.getSenderId(), + message.getRecipientId(), + message.getChannelId() + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelRequest.java new file mode 100644 index 000000000..b4f1a6c26 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/PrivateChannelRequest.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.domain.ChannelType; + +import java.util.List; +import java.util.UUID; + +public record PrivateChannelRequest( + List member, + UUID owner, + ChannelType channelType +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelRequest.java new file mode 100644 index 000000000..34b1acef5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/PublicChannelRequest.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.domain.ChannelType; + +import java.util.List; +import java.util.UUID; + +public record PublicChannelRequest( + String name, + String description, + UUID owner, + ChannelType channelType +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/UserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/UserRequest.java new file mode 100644 index 000000000..46bcb1f17 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/UserRequest.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto; + +import java.util.UUID; + +public record UserRequest( + String username, + String password, + String email, + String phoneNumber, + UUID profileImageId +// String profileImageName +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/UserResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/UserResponse.java new file mode 100644 index 000000000..4b1fdd777 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/UserResponse.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.entity.User; + +import java.util.UUID; + +public record UserResponse( + UUID id, + String username, + String email, + String phoneNumber, + boolean isOnline +) { + public static UserResponse fromEntity(User user, Boolean isOnline) { + return new UserResponse(user.getId(), user.getUsername(), user.getEmail(), user.getPhoneNumber(), isOnline); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java index 7e5a4f6f3..e905227e0 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java @@ -1,34 +1,30 @@ package com.sprint.mission.discodeit.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Getter; + import java.io.Serializable; +import java.time.Instant; import java.util.UUID; +//@Entity +@Getter public abstract class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; +// @Id private UUID id; - private Long createdAt; - private Long updatedAt; + private Instant createdAt; + private Instant updatedAt; public BaseEntity(){ this.id = id != null ? id : UUID.randomUUID(); // System.out.println("새로 생성된 UUID: " + this.id); // 로그 추가 - this.createdAt = System.currentTimeMillis(); + this.createdAt = Instant.ofEpochMilli(System.currentTimeMillis()); this.updatedAt = createdAt; } - public UUID getId(){ - return id; - } - - public Long getCreatedAt(){ - return createdAt; - } - - public Long getUpdatedAt(){ - return updatedAt; - } - public void update(){ - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.ofEpochMilli(System.currentTimeMillis()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java new file mode 100644 index 000000000..d0e93afec --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.entity; + +import com.sprint.mission.discodeit.domain.Mimetype; +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class BinaryContent implements Serializable { + private static final long getSerialVersionUID = 1L; + private UUID id; + private final Instant createdAt; + private final UUID typeId; +// private final byte[] content; + private final Mimetype mimetype; + + public BinaryContent(UUID typeId, Mimetype mimetype) { + this.id = id != null ? id : UUID.randomUUID(); + this.createdAt = Instant.ofEpochMilli(System.currentTimeMillis()); + this.typeId = typeId; +// this.content = content; + this.mimetype = mimetype; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 4268da9e3..7dc1049dd 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,24 +1,39 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.domain.ChannelType; import lombok.Getter; -import lombok.Setter; import java.io.Serializable; import java.util.List; +import java.util.UUID; -@Getter @Setter +@Getter public class Channel extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; private String name; private String description; - private List member; - private User owner; + private List member; + private UUID owner; + private ChannelType channelType; - public Channel(String name, String description, List member, User owner){ + public Channel(String name, String description, List member, UUID owner, ChannelType channelType){ super(); this.name = name; this.description = description; this.member = member; this.owner = owner; + this.channelType = channelType; + } + + public void setName(String name){ + this.name = name; + } + + public void setDescription(String description){ + this.description = description; + } + + public boolean isPrivate(){ + return this.channelType == ChannelType.Private; } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index b34607cb6..d0c46602e 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,30 +1,28 @@ package com.sprint.mission.discodeit.entity; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.io.Serializable; +import java.util.UUID; + @Getter @Setter public class Message extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; private String content; - private User sender; - private User recipient; - private Channel channel; - - - public Message(String content, User sender, Channel channel) { - super(); - this.content = content; - this.sender = sender; - this.channel = channel; - } + private UUID senderId; + private UUID recipientId; + private UUID channelId; + private BinaryContent attachedFileId; - public Message(String content, User sender, User recipient) { + public Message(String content, UUID senderId, UUID recipientId, UUID channelId) { super(); this.content = content; - this.sender = sender; - this.recipient = recipient; + this.senderId = senderId; + this.recipientId = recipientId; + this.channelId = channelId; } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java new file mode 100644 index 000000000..c9ed1cbdf --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Instant; + +@Getter +public class ReadStatus extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + private final String userId; + private final String channelId; + private Instant lastReadAt; + + public ReadStatus(String userId, String channelId, Instant lastReadAt) { + super(); + this.userId = userId; + this.channelId = channelId; + this.lastReadAt = lastReadAt; + } + + public void updateLastRead(Instant timestamp) { + this.lastReadAt = timestamp; + update(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index ab8e74177..939edab49 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -2,6 +2,7 @@ import lombok.Getter; import lombok.Setter; +import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.ArrayList; @@ -10,22 +11,25 @@ public class User extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; private String username; + private String password; private String email; private String phoneNumber; - private String addr; - private int age; - private String hobby; - private ArrayList interest; + private BinaryContent profileImage; +// private String addr; +// private int age; +// private String hobby; +// private ArrayList interest; - - public User(String username, String email, String phoneNumber, String addr, int age, String hobby, ArrayList interest){ +//String addr, int age, String hobby, ArrayList interest + public User(String username, String password, String email, String phoneNumber){ super(); this.username = username; + this.password = password; this.email = email; this.phoneNumber = phoneNumber; - this.addr = addr; - this.age = age; - this.hobby = hobby; - this.interest = interest; +// this.addr = addr; +// this.age = age; +// this.hobby = hobby; +// this.interest = interest; } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java new file mode 100644 index 000000000..3c08b9d6e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.entity; + +import lombok.Getter; + +import java.io.Serializable; +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + +@Getter +public class UserStatus extends BaseEntity implements Serializable { + private static final long getSerialVersionUID = 1L; + private final UUID userid; + private Instant lastSeenAt; + + public UserStatus(UUID userid) { + super(); + this.userid = userid; + this.lastSeenAt = Instant.ofEpochMilli(System.currentTimeMillis()); + } + + public void updateLastSeen(Instant timestamp) { + this.lastSeenAt = timestamp; + update(); + } + + public boolean isOnline() { + return Duration.between(lastSeenAt, Instant.now()).toMinutes() < 5; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java new file mode 100644 index 000000000..62d074f29 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.BinaryContent; + +import java.util.UUID; + +public interface BinaryContentRepository { + BinaryContent findById(UUID id); + BinaryContent save(BinaryContent binaryContent); + boolean delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java new file mode 100644 index 000000000..164c647f3 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.ReadStatus; + +public interface ReadStatusRepository { + ReadStatus findByUserIdAndChannelId(String userId, String channelId); + void save(ReadStatus readStatus); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java new file mode 100644 index 000000000..c8846d8b6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.UserStatus; + +import java.util.UUID; + +public interface UserStatusRepository { + void save(UserStatus userStatus); + UserStatus findByUserId(UUID userid); + +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index c78fe75a0..64b46d3df 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -5,10 +5,14 @@ import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.service.file.FileService; import org.checkerframework.checker.units.qual.C; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.io.*; import java.util.*; +@Repository +@ConditionalOnProperty(name="repository.type", havingValue = "file") public class FileChannelRepository implements ChannelRepository, FileService { private static final String CHANNEL_SAVE_FILE = "config/channel.ser"; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index aa4323009..a00c36d17 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -4,12 +4,16 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.service.file.FileService; -import org.checkerframework.checker.units.qual.A; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + import java.io.*; import java.sql.Array; import java.util.*; +@Repository +@ConditionalOnProperty(name="repository.type", havingValue = "file", matchIfMissing = true) public class FileMessageRepository implements MessageRepository, FileService { private static final String MESSAGE_SAVE_FILE = "config/message.ser"; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index e4bcf25f0..002eca6b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -3,10 +3,14 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.file.FileService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.io.*; import java.util.*; +@Repository +@ConditionalOnProperty(name = "repository.type", havingValue = "file", matchIfMissing = true) public class FileUserRepository implements UserRepository, FileService { private static final String USER_SAVE_FILE = "config/user.ser"; @@ -100,12 +104,9 @@ public User modify(UUID id, User modifiedUser){ User existingUser = users.get(id); // 기존 사용자 정보를 수정 existingUser.setUsername(modifiedUser.getUsername()); + existingUser.setPassword(modifiedUser.getPassword()); existingUser.setEmail(modifiedUser.getEmail()); existingUser.setPhoneNumber(modifiedUser.getPhoneNumber()); - existingUser.setAddr(modifiedUser.getAddr()); - existingUser.setAge(modifiedUser.getAge()); - existingUser.setHobby(modifiedUser.getHobby()); - existingUser.setInterest(modifiedUser.getInterest()); existingUser.update(); saveToFile(users); return modifiedUser; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java new file mode 100644 index 000000000..ee813c2e4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.repository.jcf; + +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.HashMap; +import java.util.Map; +import java.util.UUID; + +@Repository +@ConditionalOnProperty(name = "repository.type", havingValue = "jcf") +public class JCFBinaryContentRepository implements BinaryContentRepository { + private final Map data; + + public JCFBinaryContentRepository() { this.data = new HashMap<>(); } + + @Override + public BinaryContent findById(UUID id) { + return data.get(id); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + data.put(binaryContent.getId(), binaryContent); + return binaryContent; + } + + @Override + public boolean delete(UUID id) { + return false; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 29697dfb8..73e0c7864 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -3,9 +3,13 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.util.*; +@Repository +@ConditionalOnProperty(name="repository.type", havingValue = "jcf", matchIfMissing = true) public class JCFChannelRepository implements ChannelRepository { private final Map data; @@ -15,7 +19,7 @@ public class JCFChannelRepository implements ChannelRepository { @Override public boolean save(Channel channel) { data.put(channel.getId(), channel); - System.out.println(channel.getName() + " 채널이 오픈되었습니다."); + System.out.println(channel.getChannelType() + " 채널이 오픈되었습니다."); return true; } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index ee9208cbf..ec1865d02 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -2,10 +2,14 @@ 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.*; import java.util.stream.Collectors; +@Repository +@ConditionalOnProperty(name = "repository.type", havingValue="jcf") public class JCFMessageRepository implements MessageRepository { private final Map data; @@ -30,7 +34,7 @@ public List readAll() { @Override public List readAll(UUID id){ List list = data.values().stream() - .filter(message -> message.getChannel() != null && message.getChannel().getId().equals(id)) + .filter(message -> message.getChannelId() != null && message.getChannelId().equals(id)) .collect(Collectors.toList()); return list; @@ -44,10 +48,7 @@ public Message modify(UUID id, Message modifiedMessage) { @Override public boolean deleteById(UUID id) { try { - String sender = data.get(id).getSender().getUsername(); - String content = data.get(id).getContent(); data.remove(id); - System.out.println(sender + "님의 메시지(" +content +")를 삭제되었습니다."); return true; } catch (NullPointerException e){ System.out.println("유효하지 않은 메시지입니다.\n" + e); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index fc7fd8523..1b01b0e71 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -5,9 +5,13 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.file.FileService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; import java.util.*; +@Repository +@ConditionalOnProperty(name = "repository.type", havingValue = "jcf") public class JCFUserRepository implements UserRepository { private final Map data; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java new file mode 100644 index 000000000..6db2267aa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.repository.jcf; + +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.HashMap; +import java.util.Map; +import java.util.UUID; + +@Repository +@ConditionalOnProperty(name = "repository.type", havingValue = "jcf") +public class JCFUserStatusRepository implements UserStatusRepository { + private final Map data; + + public JCFUserStatusRepository() { this.data = new HashMap<>(); } + + @Override + public void save(UserStatus userStatus) { + data.put(userStatus.getUserid(), userStatus); + } + + @Override + public UserStatus findByUserId(UUID userid) { + return data.get(userid); + } + +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 000000000..4316b995f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.service; + +public interface AuthService { + boolean login(String userName, String password); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/CRUDService.java b/src/main/java/com/sprint/mission/discodeit/service/CRUDService.java index e108fd624..542332c47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/CRUDService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/CRUDService.java @@ -3,10 +3,10 @@ import java.util.List; import java.util.UUID; -public interface CRUDService { - T create(T entity); - T readOne(UUID id); - List readAll(); - T update(UUID id, T entity); +public interface CRUDService { + Res create(Req entity); + Res readOne(UUID id); + List readAll(); + Res update(UUID id, Req entity); boolean delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 0b2c34b6d..e60003345 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,12 +1,15 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.ChannelRequest; +import com.sprint.mission.discodeit.dto.ChannelResponse; +import com.sprint.mission.discodeit.dto.PrivateChannelRequest; +import com.sprint.mission.discodeit.dto.PublicChannelRequest; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import java.util.UUID; -public interface ChannelService extends CRUDService{ - Channel channelOwnerChange(UUID id, User owner); - boolean channelMemberJoin(UUID id, User user); - boolean channelMemberWithdrawal(UUID id, User user); +public interface ChannelService extends CRUDService{ +// ChannelResponse privateChannelCreate(PrivateChannelRequest request); +// ChannelResponse publicChannelCreate(PublicChannelRequest request); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 1564e5a22..a285e1267 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,10 +1,12 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.MessageRequest; +import com.sprint.mission.discodeit.dto.MessageResponse; import com.sprint.mission.discodeit.entity.Message; import java.util.List; import java.util.UUID; -public interface MessageService extends CRUDService { - List readAll(UUID id); +public interface MessageService extends CRUDService { + List readAll(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 4b3f24c4b..0277f3c4a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,11 +1,13 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.UserRequest; +import com.sprint.mission.discodeit.dto.UserResponse; import com.sprint.mission.discodeit.entity.User; import java.util.List; import java.util.UUID; -public interface UserService extends CRUDService{ +public interface UserService extends CRUDService{ // List searchByUser(); // User searchByUserId(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java new file mode 100644 index 000000000..4589809f4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.UserResponse; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class BasicAuthService implements AuthService { + private final UserRepository userRepository; + + @Override + public boolean login(String email, String password) { + List users = userRepository.readAll(); + + boolean login = users.stream() + .anyMatch(user -> user.getEmail().equals(email) + && user.getPassword().equals(password)); + if (!login) System.out.println("로그인정보가 틀립니다."); + else System.out.println("로그인이 완료되었습니다."); + + return login; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 1451b32db..d8f1051e6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,60 +1,99 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.ChannelType; +import com.sprint.mission.discodeit.dto.ChannelRequest; +import com.sprint.mission.discodeit.dto.ChannelResponse; +import com.sprint.mission.discodeit.dto.PrivateChannelRequest; +import com.sprint.mission.discodeit.dto.PublicChannelRequest; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.BaseRepository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.service.ChannelService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; +@Service +@RequiredArgsConstructor public class BasicChannelService implements ChannelService { - private final ChannelRepository repository; - - public BasicChannelService(ChannelRepository repository){ - this.repository = repository; - } - + private final ChannelRepository channelRepository; @Override - public Channel create(Channel channel) { - repository.save(channel); - return channel; - } + public ChannelResponse create(ChannelRequest request) { + if(request.channelType() == ChannelType.Private){ + PrivateChannelRequest privateChannel = new PrivateChannelRequest(request.member(), request.owner(), request.channelType()); + privateChannelCreate(privateChannel); + }else{ + PublicChannelRequest publicChannel = new PublicChannelRequest(request.name(), request.description(), request.owner(), request.channelType()); + publicChannelCreate(publicChannel); + } - @Override - public Channel readOne(UUID id) { - return repository.findById(id); + return null; } - @Override - public List readAll() { - return repository.readAll(); + private ChannelResponse privateChannelCreate(PrivateChannelRequest request){ + Channel channel = new Channel( + null, + null, + request.member(), + request.owner(), + request.channelType() + ); + channelRepository.save(channel); + return ChannelResponse.fromEntity(channel); } - @Override - public Channel update(UUID id, Channel updateChannel) { - return repository.modify(id, updateChannel); + private ChannelResponse publicChannelCreate(PublicChannelRequest request){ + Channel channel = new Channel( + request.name(), + request.description(), + null, + request.owner(), + request.channelType() + ); + channelRepository.save(channel); + return ChannelResponse.fromEntity(channel); } + @Override - public boolean delete(UUID id) { - return repository.deleteById(id); + public ChannelResponse readOne(UUID id) { + Channel channel = channelRepository.findById(id); + + return ChannelResponse.fromEntity(channel); } @Override - public Channel channelOwnerChange(UUID id, User owner) { - return repository.ownerChange(id, owner); + public List readAll() { + List channels = channelRepository.readAll(); + List responses = channels.stream() + .map(channel -> ChannelResponse.fromEntity(channel)) + .collect(Collectors.toList()); + return responses; } @Override - public boolean channelMemberJoin(UUID id, User user) { - return repository.memberJoin(id, user); + public ChannelResponse update(UUID id, ChannelRequest updateChannel) { + if(updateChannel.channelType() == ChannelType.Private) { + System.out.println("Private Channel은 수정할수 없습니다."); + return null; + } + Channel channel = channelRepository.modify(id, new Channel( + updateChannel.name(), + updateChannel.description(), + updateChannel.member(), + updateChannel.owner(), + updateChannel.channelType() + )); + return ChannelResponse.fromEntity(channel); } @Override - public boolean channelMemberWithdrawal(UUID id, User user) { - return repository.memberWithdrawal(id, user); + public boolean delete(UUID id) { + return channelRepository.deleteById(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 8fa5ee482..0588e4089 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,41 +1,93 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.Mimetype; +import com.sprint.mission.discodeit.dto.MessageRequest; +import com.sprint.mission.discodeit.dto.MessageResponse; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.repository.BaseRepository; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.file.FileService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicMessageService implements MessageService{ private final MessageRepository repository; - - public BasicMessageService(MessageRepository repository) { - this.repository = repository; - } + private final BinaryContentRepository binaryContentRepository; @Override - public Message create(Message message) { + public MessageResponse create(MessageRequest messageRequest) { + Message message; + + boolean isPrivateMessage = messageRequest.recipientId() != null; + boolean isChannelMessage = messageRequest.channelId() != null; + + if (isPrivateMessage) { + // 1:1 메시지 생성 + message = new Message( + messageRequest.content(), + messageRequest.senderId(), + messageRequest.recipientId(), + null + ); + } else if (isChannelMessage) { + // 채널 메시지 생성 + message = new Message( + messageRequest.content(), + messageRequest.senderId(), + null, + messageRequest.channelId() + ); + } else { + throw new IllegalArgumentException("Either recipientId or channelId must be provided."); + } + + repository.save(message); - return message; + + if(messageRequest.attachedFileId() != null){ + BinaryContent profileImage = binaryContentRepository.findById(messageRequest.attachedFileId()); + message.setAttachedFileId(profileImage); + }else{ + BinaryContent profileImage = new BinaryContent(message.getId(), Mimetype.Message); + message.setAttachedFileId(profileImage); + } + + return MessageResponse.fromEntity(message); } @Override - public Message readOne(UUID id) { - return repository.findById(id); + public MessageResponse readOne(UUID id) { + return MessageResponse.fromEntity(repository.findById(id)); } @Override - public List readAll() { - return repository.readAll(); + public List readAll() { + List messages = repository.readAll(); + List responses = (List) messages.stream().map(message -> + MessageResponse.fromEntity(message) + ); + return responses; } @Override - public Message update(UUID id, Message message) { - return repository.modify(id, message); + public MessageResponse update(UUID id, MessageRequest messageRequest) { + if (messageRequest.recipientId() != null){ + Message modifiMessage = new Message(messageRequest.content(), messageRequest.senderId(), messageRequest.recipientId(), null); + } + + Message modifiMessage = new Message(messageRequest.content(), messageRequest.senderId(), null, messageRequest.channelId()); + + Message message = repository.modify(id, modifiMessage); + return MessageResponse.fromEntity(message); } @Override @@ -44,7 +96,7 @@ public boolean delete(UUID id) { } @Override - public List readAll(UUID id) { + public List readAll(UUID id) { return null; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 588a77f3d..a7d96a68c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,69 +1,106 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.Mimetype; +import com.sprint.mission.discodeit.dto.UserRequest; +import com.sprint.mission.discodeit.dto.UserResponse; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.exception.DataNotFoundException; import com.sprint.mission.discodeit.exception.ValidationException; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.validation.Impl.ValidatorImpl; import com.sprint.mission.discodeit.validation.Validator; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; +@Service +@RequiredArgsConstructor public class BasicUserService implements UserService { private final Validator validator = new ValidatorImpl(); - private final UserRepository repository; - - public BasicUserService(UserRepository repository) { - this.repository = repository; - } - + private final UserRepository userRepository; + private final UserStatusRepository userStatusRepository; + private final BinaryContentRepository binaryContentRepository; @Override - public User create(User user) { + public UserResponse create(UserRequest request) { - if(!validator.isValidEmail(user.getEmail())){ - System.out.println(user.getUsername() + "님의 사용자 등록이 완료되지 않았습니다."); - System.out.println(new ValidationException("Invalid email format : " + user.getEmail())); + if(!validator.isValidEmail(request.email())){ + System.out.println(request.username() + "님의 사용자 등록이 완료되지 않았습니다."); + System.out.println(new ValidationException("Invalid email format : " + request.email())); } - if(!validator.isValidPhoneNumber(user.getPhoneNumber())){ - System.out.println(user.getUsername() + "님의 사용자 등록이 완료되지 않았습니다."); - System.out.println(new ValidationException("Invalid phoneNumber format(000-0000-0000) : " + user.getPhoneNumber())); + if(!validator.isValidPhoneNumber(request.phoneNumber())){ + System.out.println(request.username() + "님의 사용자 등록이 완료되지 않았습니다."); + System.out.println(new ValidationException("Invalid phoneNumber format(000-0000-0000) : " + request.phoneNumber())); + } + + User user = new User(request.username(), request.password(), request.email(), request.phoneNumber()); + userRepository.save(user); + + if(request.profileImageId() != null){ + BinaryContent profileImage = binaryContentRepository.findById(request.profileImageId()); + user.setProfileImage(profileImage); + }else{ + BinaryContent profileImage = new BinaryContent(user.getId(), Mimetype.User); + user.setProfileImage(profileImage); } - repository.save(user); - return user; + UserStatus userStatus = new UserStatus(user.getId()); + userStatusRepository.save(userStatus); + + return UserResponse.fromEntity(user , userStatus.isOnline()); } @Override - public User readOne(UUID id) { - return repository.findById(id); + public UserResponse readOne(UUID id) { + User user = userRepository.findById(id); + boolean isOnline = userStatusRepository.findByUserId(user.getId()).isOnline(); + + return UserResponse.fromEntity(user, isOnline); } @Override - public List readAll() { - return repository.readAll(); + public List readAll() { + List users = userRepository.readAll(); + List responses = users.stream().map(user -> { + boolean isOnline = userStatusRepository.findByUserId(user.getId()).isOnline(); + return UserResponse.fromEntity(user, isOnline); + }) + .collect(Collectors.toList()); + + return responses; } @Override - public User update(UUID id, User updatedUser) { + public UserResponse update(UUID id, UserRequest updatedUserReq) { try { - if(!validator.isValidEmail(updatedUser.getEmail())){ - System.out.println(updatedUser.getUsername() + "님의 사용자 수정이 완료되지 않았습니다."); - System.out.println(new ValidationException("Invalid email format : " + updatedUser.getEmail())); + if(!validator.isValidEmail(updatedUserReq.email())){ + System.out.println(updatedUserReq.username() + "님의 사용자 수정이 완료되지 않았습니다."); + System.out.println(new ValidationException("Invalid email format : " + updatedUserReq.email())); return null; } - if(!validator.isValidPhoneNumber(updatedUser.getPhoneNumber())){ - System.out.println(updatedUser.getUsername() + "님의 사용자 수정이 완료되지 않았습니다."); - System.out.println(new ValidationException("Invalid phoneNumber format(000-0000-0000) : " + updatedUser.getPhoneNumber())); + if(!validator.isValidPhoneNumber(updatedUserReq.phoneNumber())){ + System.out.println(updatedUserReq.username() + "님의 사용자 수정이 완료되지 않았습니다."); + System.out.println(new ValidationException("Invalid phoneNumber format(000-0000-0000) : " + updatedUserReq.phoneNumber())); return null; } - return repository.modify(id, updatedUser); + User user = userRepository.modify(id, new User(updatedUserReq.username(), updatedUserReq.password(), updatedUserReq.email(), updatedUserReq.phoneNumber())); + boolean isOnline = userStatusRepository.findByUserId(id).isOnline(); + + System.out.println("업데이트가 완료되었습니다."); + return UserResponse.fromEntity(user, isOnline); + } catch (DataNotFoundException e){ throw new DataNotFoundException("저장되지 않았거나, 삭제된 아이디 입니다." + id); } @@ -71,6 +108,6 @@ public User update(UUID id, User updatedUser) { @Override public boolean delete(UUID id) { - return repository.deleteById(id); + return userRepository.deleteById(id); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 000000000..5b0da8807 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,6 @@ +spring: + autoconfigure: + exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + +repository: + type : jcf # jcf or file