diff --git a/src/main/java/com/chat/liveon/auth/entity/Person.java b/src/main/java/com/chat/liveon/auth/entity/Person.java index 3205be3..f49a9dc 100644 --- a/src/main/java/com/chat/liveon/auth/entity/Person.java +++ b/src/main/java/com/chat/liveon/auth/entity/Person.java @@ -1,15 +1,12 @@ package com.chat.liveon.auth.entity; -import com.chat.liveon.chat.entity.ChatMessage; import com.chat.liveon.chat.entity.ChatRoom; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; @Entity @Getter @@ -24,6 +21,9 @@ public class Person { private Role role; private String profilePicture; + @ManyToMany(mappedBy = "participants") + private Set chatRooms = new HashSet<>(); + public Person(String personId, String personName, String encodedPassword, Role role, String profilePicture) { this.personId = personId; this.personName = personName; diff --git a/src/main/java/com/chat/liveon/auth/service/AuthService.java b/src/main/java/com/chat/liveon/auth/service/AuthService.java index 4fc514e..a85b8b6 100644 --- a/src/main/java/com/chat/liveon/auth/service/AuthService.java +++ b/src/main/java/com/chat/liveon/auth/service/AuthService.java @@ -7,11 +7,11 @@ import com.chat.liveon.auth.entity.Role; import com.chat.liveon.auth.exception.AuthenticationFailureException; import com.chat.liveon.auth.repository.PersonRepository; +import com.chat.liveon.chat.service.ChatRoomService; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,10 +22,12 @@ public class AuthService { private final PasswordEncoder passwordEncoder; private final PersonRepository personRepository; + private final ChatRoomService chatRoomService; - public AuthService(final PasswordEncoder passwordEncoder, final PersonRepository personRepository) { + public AuthService(final PasswordEncoder passwordEncoder, final PersonRepository personRepository, ChatRoomService chatRoomService) { this.passwordEncoder = passwordEncoder; this.personRepository = personRepository; + this.chatRoomService = chatRoomService; } @Transactional @@ -36,6 +38,7 @@ public void register(RegisterRequest authRequest) { String encodedPassword = passwordEncoder.encrypt(authRequest.personId(), authRequest.personPassword()); Person person = new Person(authRequest.personId(), authRequest.personName(), encodedPassword, Role.ROLE_USER, authRequest.profilePicture()); personRepository.save(person); + chatRoomService.addUserToAllChatRooms(person); } @Transactional diff --git a/src/main/java/com/chat/liveon/auth/service/PasswordEncoder.java b/src/main/java/com/chat/liveon/auth/service/PasswordEncoder.java index 7901d98..be5efbb 100644 --- a/src/main/java/com/chat/liveon/auth/service/PasswordEncoder.java +++ b/src/main/java/com/chat/liveon/auth/service/PasswordEncoder.java @@ -10,11 +10,8 @@ import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; -import java.util.Arrays; import java.util.Base64; -import static java.util.Objects.hash; - @Component public class PasswordEncoder { diff --git a/src/main/java/com/chat/liveon/auth/service/PersonService.java b/src/main/java/com/chat/liveon/auth/service/PersonService.java index 232ff90..4933242 100644 --- a/src/main/java/com/chat/liveon/auth/service/PersonService.java +++ b/src/main/java/com/chat/liveon/auth/service/PersonService.java @@ -1,4 +1,19 @@ package com.chat.liveon.auth.service; +import com.chat.liveon.auth.entity.Person; +import com.chat.liveon.auth.repository.PersonRepository; +import com.chat.liveon.chat.service.ChatRoomService; +import org.springframework.stereotype.Service; + +@Service public class PersonService { + private final PersonRepository personRepository; + + public PersonService(PersonRepository personRepository) { + this.personRepository = personRepository; + } + + public Person findByPersonId(Long personId) { + return personRepository.findById(personId).orElseThrow(); + } } diff --git a/src/main/java/com/chat/liveon/chat/controller/ChatMessageController.java b/src/main/java/com/chat/liveon/chat/controller/ChatMessageController.java index 6d0e9d7..3d8a0be 100644 --- a/src/main/java/com/chat/liveon/chat/controller/ChatMessageController.java +++ b/src/main/java/com/chat/liveon/chat/controller/ChatMessageController.java @@ -10,10 +10,7 @@ import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -28,6 +25,7 @@ public class ChatMessageController { @SendTo("/topic/chatroom/{roomId}") public ChatMessageResponse sendMessage(@DestinationVariable("roomId") String roomId, ChatMessageRequest message) { Long roomIdLong = Long.parseLong(roomId); + return chatMessageService.sendMessage(roomIdLong, message); } @@ -35,6 +33,7 @@ public ChatMessageResponse sendMessage(@DestinationVariable("roomId") String roo @GetMapping("/chat-room/{roomId}/messages") public ResponseEntity> getChatMessages(@PathVariable("roomId") Long roomId, @RequestParam(name = "page", defaultValue = "0") int page, @RequestParam(name = "size", defaultValue = "20") int size) { List messages = chatMessageService.getMessagesByRoomId(roomId, page, size); + return ResponseEntity.ok(messages); } } diff --git a/src/main/java/com/chat/liveon/chat/controller/ChatMessageStatusController.java b/src/main/java/com/chat/liveon/chat/controller/ChatMessageStatusController.java index c94d2d3..edb27f8 100644 --- a/src/main/java/com/chat/liveon/chat/controller/ChatMessageStatusController.java +++ b/src/main/java/com/chat/liveon/chat/controller/ChatMessageStatusController.java @@ -1,4 +1,33 @@ package com.chat.liveon.chat.controller; +import com.chat.liveon.chat.dto.response.UnreadMessagesResponse; +import com.chat.liveon.chat.service.ChatMessageStatusService; +import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor public class ChatMessageStatusController { + private final ChatMessageStatusService chatMessageStatusService; + + @PostMapping("/chat-room/{chatRoomId}/read-messages") + public ResponseEntity markMessagesAsRead(@PathVariable("chatRoomId") Long chatRoomId, HttpSession session) { + String personId = (String) session.getAttribute("personId"); + chatMessageStatusService.markMessagesAsRead(chatRoomId, personId); + + return ResponseEntity.ok().build(); + } + + @GetMapping("/chat-room/unread-messages") + public ResponseEntity> getUnreadMessages(HttpSession session) { + String personId = (String) session.getAttribute("personId"); + List response = chatMessageStatusService.getUnreadMessages(personId); + + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/chat/liveon/chat/controller/ChatRoomController.java b/src/main/java/com/chat/liveon/chat/controller/ChatRoomController.java index 19fd108..247e77b 100644 --- a/src/main/java/com/chat/liveon/chat/controller/ChatRoomController.java +++ b/src/main/java/com/chat/liveon/chat/controller/ChatRoomController.java @@ -3,6 +3,7 @@ import com.chat.liveon.chat.dto.request.ChatRoomRequest; import com.chat.liveon.chat.dto.response.AllChatRoomResponse; import com.chat.liveon.chat.dto.response.ChatRoomResponse; +import com.chat.liveon.chat.service.ChatMessageStatusService; import com.chat.liveon.chat.service.ChatRoomService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,6 +21,7 @@ public class ChatRoomController { private final ChatRoomService chatRoomService; + private final ChatMessageStatusService chatMessageStatusService; @Operation(summary = "채팅방 생성 API") @PostMapping("/chat-room") @@ -32,8 +34,17 @@ public ResponseEntity createChatRoom(@RequestBody ChatRoomRequ @Operation(summary = "채팅방 조회 API") @GetMapping("/chat-room") - public ResponseEntity> getChatRoom() { - List response = chatRoomService.getAllChatRoom(); + public ResponseEntity> getChatRoom(HttpSession session) { + String personId = (String) session.getAttribute("personId"); + List response = chatRoomService.getAllChatRoom(personId); return ResponseEntity.ok(response); } + + @PostMapping("/chat-room/{chatRoomId}/enter") + public ResponseEntity enterChatRoom(@PathVariable("chatRoomId") Long chatRoomId, HttpSession session) { + String personId = (String) session.getAttribute("personId"); + chatMessageStatusService.markMessagesAsRead(chatRoomId, personId); + chatRoomService.addUserToChatRoom(chatRoomId, personId); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/chat/liveon/chat/dto/NotificationMessage.java b/src/main/java/com/chat/liveon/chat/dto/NotificationMessage.java index 28ff5ca..6783249 100644 --- a/src/main/java/com/chat/liveon/chat/dto/NotificationMessage.java +++ b/src/main/java/com/chat/liveon/chat/dto/NotificationMessage.java @@ -1,4 +1,6 @@ package com.chat.liveon.chat.dto; -public class NotificationMessage { -} +public record NotificationMessage( + Long chatRoomId, + Long unreadCount +) {} diff --git a/src/main/java/com/chat/liveon/chat/dto/response/AllChatRoomResponse.java b/src/main/java/com/chat/liveon/chat/dto/response/AllChatRoomResponse.java index f94bb92..bb2dea8 100644 --- a/src/main/java/com/chat/liveon/chat/dto/response/AllChatRoomResponse.java +++ b/src/main/java/com/chat/liveon/chat/dto/response/AllChatRoomResponse.java @@ -2,5 +2,6 @@ public record AllChatRoomResponse( Long chatRoomId, - String chatRoomName + String chatRoomName, + Long unreadCount ) {} diff --git a/src/main/java/com/chat/liveon/chat/dto/response/UnreadMessagesResponse.java b/src/main/java/com/chat/liveon/chat/dto/response/UnreadMessagesResponse.java index 0c008ea..ab894fa 100644 --- a/src/main/java/com/chat/liveon/chat/dto/response/UnreadMessagesResponse.java +++ b/src/main/java/com/chat/liveon/chat/dto/response/UnreadMessagesResponse.java @@ -1,4 +1,7 @@ package com.chat.liveon.chat.dto.response; -public class UnreadMessagesResponse { -} +public record UnreadMessagesResponse( + Long chatRoomId, + String chatRoomName, + Long unreadCount +) {} \ No newline at end of file diff --git a/src/main/java/com/chat/liveon/chat/entity/ChatMessageStatus.java b/src/main/java/com/chat/liveon/chat/entity/ChatMessageStatus.java index 28408cf..d480f24 100644 --- a/src/main/java/com/chat/liveon/chat/entity/ChatMessageStatus.java +++ b/src/main/java/com/chat/liveon/chat/entity/ChatMessageStatus.java @@ -1,4 +1,39 @@ package com.chat.liveon.chat.entity; +import com.chat.liveon.auth.entity.Person; +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor public class ChatMessageStatus { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "chat_message_id") + private ChatMessage chatMessage; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "person_id") + private Person person; + + @Column(name = "is_read") + private boolean read; + + @Builder + public ChatMessageStatus(ChatMessage chatMessage, Person person) { + this.chatMessage = chatMessage; + this.person = person; + this.read = false; + } + + public void read() { + this.read = true; + } } diff --git a/src/main/java/com/chat/liveon/chat/entity/ChatRoom.java b/src/main/java/com/chat/liveon/chat/entity/ChatRoom.java index a974ff9..31b9f7e 100644 --- a/src/main/java/com/chat/liveon/chat/entity/ChatRoom.java +++ b/src/main/java/com/chat/liveon/chat/entity/ChatRoom.java @@ -6,6 +6,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.HashSet; +import java.util.Set; + @Getter @NoArgsConstructor @Entity @@ -22,9 +25,20 @@ public class ChatRoom { @JoinColumn(name = "person_id") private Person person; + @ManyToMany + @JoinTable(name = "chat_room_participants", + joinColumns = @JoinColumn(name = "chat_room_id"), + inverseJoinColumns = @JoinColumn(name = "person_id")) + private Set participants = new HashSet<>(); + @Builder public ChatRoom(String chatRoomName, Person person) { this.chatRoomName = chatRoomName; this.person = person; } -} \ No newline at end of file + + public void addParticipant(Person person) { + participants.add(person); + person.getChatRooms().add(this); + } +} diff --git a/src/main/java/com/chat/liveon/chat/repository/ChatMessageStatusRepository.java b/src/main/java/com/chat/liveon/chat/repository/ChatMessageStatusRepository.java index bd30417..b80d8c4 100644 --- a/src/main/java/com/chat/liveon/chat/repository/ChatMessageStatusRepository.java +++ b/src/main/java/com/chat/liveon/chat/repository/ChatMessageStatusRepository.java @@ -1,4 +1,23 @@ package com.chat.liveon.chat.repository; -public interface ChatMessageStatusRepository { +import com.chat.liveon.chat.dto.response.UnreadMessagesResponse; +import com.chat.liveon.chat.entity.ChatMessageStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface ChatMessageStatusRepository extends JpaRepository { + Long countByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(@Param("chatRoomId") Long chatRoomId, @Param("personId") String personId); + + @Query("SELECT cms.chatMessage.chatRoom.id, cms.chatMessage.chatRoom.chatRoomName, COUNT(cms) " + + "FROM ChatMessageStatus cms " + + "WHERE cms.person.personId = :personId AND cms.read = false " + + "GROUP BY cms.chatMessage.chatRoom.id, cms.chatMessage.chatRoom.chatRoomName") + List countUnreadMessagesByChatRoomAndPerson(@Param("personId") String personId); + + List findByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(Long chatRoomId, String personId); + } + diff --git a/src/main/java/com/chat/liveon/chat/repository/ChatRoomRepository.java b/src/main/java/com/chat/liveon/chat/repository/ChatRoomRepository.java index a45a7be..d2d40bb 100644 --- a/src/main/java/com/chat/liveon/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/chat/liveon/chat/repository/ChatRoomRepository.java @@ -2,11 +2,13 @@ import com.chat.liveon.chat.entity.ChatRoom; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.lang.NonNull; +import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface ChatRoomRepository extends JpaRepository { - @NonNull Optional findById(Long roomId); + + List findByParticipants_PersonId(@Param("personId") String personId); } \ No newline at end of file diff --git a/src/main/java/com/chat/liveon/chat/service/ChatMessageService.java b/src/main/java/com/chat/liveon/chat/service/ChatMessageService.java index 40d4217..c48ba69 100644 --- a/src/main/java/com/chat/liveon/chat/service/ChatMessageService.java +++ b/src/main/java/com/chat/liveon/chat/service/ChatMessageService.java @@ -2,21 +2,26 @@ import com.chat.liveon.auth.entity.Person; import com.chat.liveon.auth.repository.PersonRepository; +import com.chat.liveon.chat.dto.NotificationMessage; import com.chat.liveon.chat.dto.request.ChatMessageRequest; import com.chat.liveon.chat.dto.response.ChatMessageResponse; import com.chat.liveon.chat.entity.ChatMessage; +import com.chat.liveon.chat.entity.ChatMessageStatus; import com.chat.liveon.chat.entity.ChatRoom; import com.chat.liveon.chat.repository.ChatMessageRepository; +import com.chat.liveon.chat.repository.ChatMessageStatusRepository; import com.chat.liveon.chat.repository.ChatRoomRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -27,6 +32,8 @@ public class ChatMessageService { private final ChatMessageRepository chatMessageRepository; private final ChatRoomRepository chatRoomRepository; private final PersonRepository personRepository; + private final ChatMessageStatusRepository chatMessageStatusRepository; + private final SimpMessagingTemplate messagingTemplate; @Transactional public ChatMessageResponse sendMessage(Long roomId, ChatMessageRequest messageRequest) { @@ -44,6 +51,20 @@ public ChatMessageResponse sendMessage(Long roomId, ChatMessageRequest messageRe chatMessage = chatMessageRepository.save(chatMessage); log.info("[메시지 전송 성공] 채팅방: {}, 사용자: {}, 메시지: {}", roomId, sender.getPersonName(), messageRequest.message()); + Set participants = chatRoom.getParticipants(); + for (Person person : participants) { + if (!person.getPersonId().equals(sender.getPersonId())) { + ChatMessageStatus messageStatus = ChatMessageStatus.builder() + .chatMessage(chatMessage) + .person(person) + .build(); + chatMessageStatusRepository.save(messageStatus); + long unreadCount = chatMessageStatusRepository.countByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(roomId, person.getPersonId()); + NotificationMessage notification = new NotificationMessage(roomId, unreadCount); + messagingTemplate.convertAndSend("/topic/notifications/" + person.getPersonId(), notification); + } + } + return new ChatMessageResponse( chatMessage.getChatRoom().getId(), sender.getPersonName(), diff --git a/src/main/java/com/chat/liveon/chat/service/ChatMessageStatusService.java b/src/main/java/com/chat/liveon/chat/service/ChatMessageStatusService.java index d089c06..8efc42f 100644 --- a/src/main/java/com/chat/liveon/chat/service/ChatMessageStatusService.java +++ b/src/main/java/com/chat/liveon/chat/service/ChatMessageStatusService.java @@ -1,4 +1,48 @@ package com.chat.liveon.chat.service; +import com.chat.liveon.auth.entity.Person; +import com.chat.liveon.auth.repository.PersonRepository; +import com.chat.liveon.chat.dto.NotificationMessage; +import com.chat.liveon.chat.dto.response.UnreadMessagesResponse; +import com.chat.liveon.chat.entity.ChatMessageStatus; +import com.chat.liveon.chat.repository.ChatMessageStatusRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor public class ChatMessageStatusService { + + private final ChatMessageStatusRepository chatMessageStatusRepository; + private final PersonRepository personRepository; + private final SimpMessagingTemplate messagingTemplate; + + @Transactional + public void markMessagesAsRead(Long chatRoomId, String personId) { + Person person = personRepository.findByPersonId(personId) + .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다: " + personId)); + + List unreadMessages = chatMessageStatusRepository.findByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(chatRoomId, personId); + for (ChatMessageStatus messageStatus : unreadMessages) { + messageStatus.read(); + } + chatMessageStatusRepository.saveAll(unreadMessages); + + long updatedUnreadCount = chatMessageStatusRepository + .countByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(chatRoomId, personId); + NotificationMessage notification = new NotificationMessage(chatRoomId, updatedUnreadCount); + messagingTemplate.convertAndSend("/topic/notifications/" + person.getPersonId(), notification); + } + + @Transactional(readOnly = true) + public List getUnreadMessages(String personId) { + return chatMessageStatusRepository.countUnreadMessagesByChatRoomAndPerson(personId); + } } + diff --git a/src/main/java/com/chat/liveon/chat/service/ChatRoomService.java b/src/main/java/com/chat/liveon/chat/service/ChatRoomService.java index fbd43c5..1e22eff 100644 --- a/src/main/java/com/chat/liveon/chat/service/ChatRoomService.java +++ b/src/main/java/com/chat/liveon/chat/service/ChatRoomService.java @@ -6,6 +6,7 @@ import com.chat.liveon.chat.dto.response.AllChatRoomResponse; import com.chat.liveon.chat.dto.response.ChatRoomResponse; import com.chat.liveon.chat.entity.ChatRoom; +import com.chat.liveon.chat.repository.ChatMessageStatusRepository; import com.chat.liveon.chat.repository.ChatRoomRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -19,10 +20,12 @@ public class ChatRoomService { private final ChatRoomRepository chatRoomRepository; private final PersonRepository personRepository; + private final ChatMessageStatusRepository chatMessageStatusRepository; - public ChatRoomService(ChatRoomRepository chatRoomRepository, PersonRepository personRepository) { + public ChatRoomService(ChatRoomRepository chatRoomRepository, PersonRepository personRepository, ChatMessageStatusRepository chatMessageStatusRepository) { this.chatRoomRepository = chatRoomRepository; this.personRepository = personRepository; + this.chatMessageStatusRepository = chatMessageStatusRepository; } @Transactional @@ -34,17 +37,54 @@ public ChatRoomResponse createChatRoom(ChatRoomRequest chatRoomRequest, String p .chatRoomName(chatRoomRequest.chatRoomName()) .person(personId) .build(); - + chatRoom.addParticipant(personId); + addAllUsersToChatRoom(chatRoom); chatRoom = chatRoomRepository.save(chatRoom); - log.info("[채팅방 생성 성공] 사용자: {}, 채팅방명: {}", person, chatRoomRequest.chatRoomName()); + return new ChatRoomResponse(chatRoom.getId(), chatRoomRequest.chatRoomName(), personId.getId()); } @Transactional(readOnly = true) - public List getAllChatRoom() { - List chatRooms = chatRoomRepository.findAll(); + public List getAllChatRoom(String personId) { + List chatRooms = chatRoomRepository.findByParticipants_PersonId(personId); return chatRooms.stream() - .map(chatRoom -> new AllChatRoomResponse(chatRoom.getId(), chatRoom.getChatRoomName())) + .map(chatRoom -> { + Long unreadCount = chatMessageStatusRepository.countByChatMessage_ChatRoom_IdAndPerson_PersonIdAndReadFalse(chatRoom.getId(), personId); + return new AllChatRoomResponse(chatRoom.getId(), chatRoom.getChatRoomName(), unreadCount); + }) .collect(Collectors.toList()); } + + @Transactional + public void addUserToChatRoom(Long chatRoomId, String personId) { + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new RuntimeException("채팅방을 찾을 수 없습니다. ID: " + chatRoomId)); + Person person = personRepository.findByPersonId(personId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다. personId: " + personId)); + + if (!chatRoom.getParticipants().contains(person)) { + chatRoom.addParticipant(person); + chatRoomRepository.save(chatRoom); + } + } + + @Transactional + public void addUserToAllChatRooms(Person user) { + List allChatRooms = chatRoomRepository.findAll(); + for (ChatRoom chatRoom : allChatRooms) { + if (!chatRoom.getParticipants().contains(user)) { + chatRoom.addParticipant(user); + } + } + chatRoomRepository.saveAll(allChatRooms); + } + + private void addAllUsersToChatRoom(ChatRoom chatRoom) { + List allUsers = personRepository.findAll(); + for (Person user : allUsers) { + if (!chatRoom.getParticipants().contains(user)) { + chatRoom.addParticipant(user); + } + } + } } diff --git a/src/main/java/com/chat/liveon/config/WebConfig.java b/src/main/java/com/chat/liveon/config/WebConfig.java index 6bc5603..6e4adfd 100644 --- a/src/main/java/com/chat/liveon/config/WebConfig.java +++ b/src/main/java/com/chat/liveon/config/WebConfig.java @@ -12,7 +12,7 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOriginPatterns("http://localhost:3000") + .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true);