Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ BaseResponse<CreateChatRes> createChat(
Member member
);

@Operation(summary = "링크 삭제", description = "해당 링크방과 채팅 기록을 전부 Hard Delete 진행합니다.")
BaseResponse<String> deleteChat(Member member, Long chatId);

void sendMessage(@Parameter(description = "채팅방 Id", required = true) Long chatId,
@Parameter(description = "사용자 질문 내용", required = true) String message, Member member);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down Expand Up @@ -40,14 +42,21 @@ public BaseResponse<CreateChatRes> createChat(@RequestBody @Valid CreateChatReq
return BaseResponse.success(res, "채팅방 생성 완료");
}

@MessageMapping("/send/{chatId}")
@Override
@DeleteMapping("/{chatId}")
public BaseResponse<String> deleteChat(@AuthMember Member member, @PathVariable Long chatId) {
chatFacade.deleteChat(member, chatId);
return BaseResponse.noContent("성공적으로 삭제했습니다.");
}

@Override
@MessageMapping("/send/{chatId}")
public void sendMessage(@DestinationVariable Long chatId, @Payload String message, @AuthMember Member member) {
chatFacade.generateAnswer(chatId, member, message);
}

@MessageMapping("/cancel/{chatId}")
@Override
@MessageMapping("/cancel/{chatId}")
public void cancelMessage(@DestinationVariable Long chatId, @AuthMember Member member) {
chatFacade.cancelAnswer(chatId, member);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.sofa.linkiving.domain.chat.enums.Sentiment;
import com.sofa.linkiving.global.common.BaseEntity;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
Expand All @@ -20,7 +19,7 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "feedbacks")
public class Feedback extends BaseEntity {
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "message_id")
private Message message;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ public ChatsRes getChats(Member member) {
return ChatsRes.from(chats);
}

@Transactional
public void deleteChat(Member member, Long chatId) {
Chat chat = chatService.getChat(chatId, member);

feedbackService.deleteAll(chat);
messageService.deleteAll(chat);
chatService.delete(chat);
}

@Transactional
public void generateAnswer(Long chatId, Member member, String message) {
Chat chat = chatService.getChat(chatId, member);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package com.sofa.linkiving.domain.chat.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.sofa.linkiving.domain.chat.entity.Chat;
import com.sofa.linkiving.domain.chat.entity.Feedback;

@Repository
public interface FeedbackRepository extends JpaRepository<Feedback, Long> {
@Modifying(clearAutomatically = true)
@Query("DELETE FROM Feedback f WHERE f.message.id IN (SELECT m.id FROM Message m WHERE m.chat = :chat)")
void deleteAllByChat(@Param("chat") Chat chat);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package com.sofa.linkiving.domain.chat.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.sofa.linkiving.domain.chat.entity.Chat;
import com.sofa.linkiving.domain.chat.entity.Message;

@Repository
public interface MessageRepository extends JpaRepository<Message, Long> {
@Modifying(clearAutomatically = true)
@Query("DELETE FROM Message m WHERE m.chat = :chat")
void deleteAllByChat(Chat chat);

@Query("SELECT m FROM Message m LEFT JOIN FETCH m.feedback WHERE m.chat = :chat")
List<Message> findAllByChat(Chat chat);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ public Chat saveChat(String title, Member member) {
.build()
);
}

public void deleteChat(Chat chat) {
chatRepository.delete(chat);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
import com.sofa.linkiving.domain.member.entity.Member;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@RequiredArgsConstructor
public class ChatService {
Expand All @@ -21,6 +19,10 @@ public Chat getChat(Long chatId, Member member) {
return chatQueryService.findChat(chatId, member);
}

public void delete(Chat chat) {
chatCommandService.deleteChat(chat);
}

public List<Chat> getChats(Member member) {
return chatQueryService.findAllOrderByLastMessageDesc(member);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.springframework.stereotype.Service;

import com.sofa.linkiving.domain.chat.entity.Chat;
import com.sofa.linkiving.domain.chat.repository.FeedbackRepository;

import lombok.RequiredArgsConstructor;
Expand All @@ -10,4 +11,8 @@
@RequiredArgsConstructor
public class FeedbackCommandService {
private final FeedbackRepository feedbackRepository;

public void deleteFeedbacksByChat(Chat chat) {
feedbackRepository.deleteAllByChat(chat);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@

import org.springframework.stereotype.Service;

import com.sofa.linkiving.domain.chat.entity.Chat;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class FeedbackService {
private final FeedbackQueryService feedbackQueryService;
private final FeedbackCommandService feedbackCommandService;

public void deleteAll(Chat chat) {
feedbackCommandService.deleteFeedbacksByChat(chat);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.springframework.stereotype.Service;

import com.sofa.linkiving.domain.chat.entity.Chat;
import com.sofa.linkiving.domain.chat.entity.Message;
import com.sofa.linkiving.domain.chat.repository.MessageRepository;

Expand All @@ -12,6 +13,10 @@
public class MessageCommandService {
private final MessageRepository messageRepository;

public void deleteAllByChat(Chat chat) {
messageRepository.deleteAllByChat(chat);
}

public Message saveMessage(Message message) {
return messageRepository.save(message);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.sofa.linkiving.domain.chat.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.sofa.linkiving.domain.chat.entity.Chat;
import com.sofa.linkiving.domain.chat.entity.Message;
import com.sofa.linkiving.domain.chat.repository.MessageRepository;

import lombok.RequiredArgsConstructor;
Expand All @@ -10,4 +14,8 @@
@RequiredArgsConstructor
public class MessageQueryService {
private final MessageRepository messageRepository;

public List<Message> findAllByChat(Chat chat) {
return messageRepository.findAllByChat(chat);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sofa.linkiving.domain.chat.service;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

Expand Down Expand Up @@ -27,6 +28,14 @@ public class MessageService {
private final WebClient webClient = WebClient.create("http://localhost:8080/mock/ai");
private final Map<String, StringBuilder> messageBuffers = new ConcurrentHashMap<>();

public void deleteAll(Chat chat) {
messageCommandService.deleteAllByChat(chat);
}

public List<Message> getMessagesByChat(Chat chat) {
return messageQueryService.findAllByChat(chat);
}

public void generateAnswer(Chat chat, String userMessage) {

String roomId = chat.getId().toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,25 @@ void shouldReturnCreateChatResWhenCreateChat() {

verify(chatService).createChat(generatedTitle, member);
}

@Test
@DisplayName("채팅방 삭제 요청 시 하위 데이터(피드백, 메시지) 일괄 삭제 및 채팅방 제거 위임")
void shouldDeleteAllRelatedDataWhenDeleteChat() {
// given
Long chatId = 1L;
Chat chat = mock(Chat.class);

given(chatService.getChat(chatId, member)).willReturn(chat);

// when
chatFacade.deleteChat(member, chatId);

// then
// 1. 피드백 삭제 호출 확인
verify(feedbackService).deleteAll(chat);
// 2. 메시지 삭제 호출 확인
verify(messageService).deleteAll(chat);
// 3. 채팅방 삭제 호출 확인
verify(chatService).delete(chat);
}
}

This file was deleted.

Loading