20240712 (금) Hercute팀 - 메추리알(MCRA) 채팅부분 1차 완료

2024. 7. 12. 16:38TIL

최근 자바 공부때문에 조금 신경을 많이 못썻는데 마침 1주차 과제를 대충 완료한 시점이라 채팅부분도 내가 마저 완료해보았다.

 

package com.hercute.mcrabe.domain.chat.chatroom.service

import com.hercute.mcrabe.domain.chat.chatroom.dto.ChatRoomResponse
import com.hercute.mcrabe.domain.chat.chatroom.dto.SendMessageRequest
import com.hercute.mcrabe.domain.chat.chatroom.model.ChatMessage
import com.hercute.mcrabe.domain.chat.chatroom.model.ChatRoom
import com.hercute.mcrabe.domain.chat.chatroom.repository.message.ChatMessageRepository
import com.hercute.mcrabe.domain.chat.chatroom.repository.room.ChatRoomRepository
import com.hercute.mcrabe.domain.members.repository.MemberRepository
import com.hercute.mcrabe.global.error.exception.ModelNotFoundException
import com.hercute.mcrabe.global.infra.security.jwt.UserPrincipal
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service

@Service
class ChatRoomServiceImpl(
    private val memberRepository: MemberRepository,
    private val chatRoomRepository: ChatRoomRepository,
    private val chatMessageRepository: ChatMessageRepository
):ChatRoomService {
    override fun createChatRoom(memberAId: Long, memberBId: Long) {
        val memberA = memberRepository.findByIdOrNull(memberAId)
            ?: throw ModelNotFoundException("member", memberAId)
        val memberB = memberRepository.findByIdOrNull(memberBId)
            ?: throw ModelNotFoundException("member", memberBId)
        val chatRoom = ChatRoom(
            memberA = memberA,
            memberB = memberB
        )
        chatRoomRepository.save(chatRoom)
    }

    override fun leaveChatRoom(memberId: Long, chatRoomId: Long) {
        val member = memberRepository.findByIdOrNull(memberId)
            ?: throw ModelNotFoundException("member", memberId)
        val chatRoom = chatRoomRepository.findByIdOrNull(chatRoomId)
            ?: throw ModelNotFoundException("chat room", chatRoomId)
        if (chatRoom.memberA.id == member.id) {
            chatRoom.memberA.isDeleted = true
        }
        else if (chatRoom.memberB.id == member.id) {
            chatRoom.memberB.isDeleted = true
        }
        chatRoomRepository.save(chatRoom)
    }

    override fun getChatRoom(chatRoomId: Long): ChatRoomResponse {
        val chatRoom = chatRoomRepository.findByIdOrNull(chatRoomId)
            ?: throw ModelNotFoundException("chat room", chatRoomId)
        return ChatRoomResponse.from(chatRoom)
    }

    override fun sendMessage(memberId: Long, chatRoomId: Long, request: SendMessageRequest) {
        val member = memberRepository.findByIdOrNull(memberId)
            ?: throw ModelNotFoundException("member", memberId)
        val chatRoom = chatRoomRepository.findByIdOrNull(chatRoomId)
            ?: throw ModelNotFoundException("chat room", chatRoomId)
        val message = ChatMessage (
            member = member,
            chatRoom = chatRoom,
            message = request.message
        )
        chatMessageRepository.save(message)
    }
}

 

일단 기본적으로 채팅방 생성, 채팅방 떠나기, 메세지보내기 정도를 생각해보았고,

만들다가 채팅방 조회기능도 하나 만들어두면 좋을것 같아서

  @GetMapping("/{chatRoomId}")
    fun getChatRoom (
        @PathVariable chatRoomId: Long,
    ): ResponseEntity<ChatRoomResponse> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(chatRoomService.getChatRoom(chatRoomId))
    }

메소드를 하나 제작하였다.

채팅방 관련부분은 코드보다는 실제로 채팅창기능을 구현하는 과정이 더 중요할것 같다.