From 26bfd38bb990adbb8bb1f03001d5568ac3f10760 Mon Sep 17 00:00:00 2001 From: KimSoo Date: Fri, 21 Oct 2022 17:16:01 +0900 Subject: [PATCH] =?UTF-8?q?Add/Refactor(hyunsoo/chat):=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C/=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=A0=91=EC=86=8D?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20meetingNo=20->=20c?= =?UTF-8?q?hatRoomNo=20#92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main-project/src/chats/chats.gateway.ts | 23 +++++----- main-project/src/chats/chats.service.ts | 42 +++++++++++++++---- .../src/chats/interface/chat.interface.ts | 5 ++- .../chats/repository/chat-list.repository.ts | 6 +-- 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/main-project/src/chats/chats.gateway.ts b/main-project/src/chats/chats.gateway.ts index 9e0edbf1..1016991f 100644 --- a/main-project/src/chats/chats.gateway.ts +++ b/main-project/src/chats/chats.gateway.ts @@ -8,7 +8,11 @@ import { } from '@nestjs/websockets'; import { Namespace, Socket } from 'socket.io'; import { ChatService } from './chats.service'; -import { CreateChat, JoinChatRoom } from './interface/chat.interface'; +import { + CreateChat, + JoinChatRoom, + MessagePayload, +} from './interface/chat.interface'; @WebSocketGateway(4000, { namespace: 'chat' }) export class ChatsGateway { @@ -63,11 +67,7 @@ export class ChatsGateway { @MessageBody() messagePayload: JoinChatRoom, ) { try { - const nickname = await this.chatService.joinRoom(socket, messagePayload); - this.nsp.emit('join-room', { - username: nickname, - msg: `${nickname}님이 접속하셨습니다.`, - }); + await this.chatService.joinRoom(socket, messagePayload); return { success: true }; } catch (err) { @@ -75,12 +75,15 @@ export class ChatsGateway { } } - @SubscribeMessage('ClientToServer') + @SubscribeMessage('message') async handelMessage( @ConnectedSocket() socket: Socket, - @MessageBody() message: string, + @MessageBody() messagePayload: MessagePayload, ) { - socket.broadcast.emit('message', { username: socket.id, message }); - return { username: socket.id, message }; + try { + await this.chatService.sendChat(socket, messagePayload); + } catch (err) { + throw err; + } } } diff --git a/main-project/src/chats/chats.service.ts b/main-project/src/chats/chats.service.ts index d0c183f3..bb8e3dbd 100644 --- a/main-project/src/chats/chats.service.ts +++ b/main-project/src/chats/chats.service.ts @@ -10,6 +10,8 @@ import { ChatRoom, ChatRoomUsers, CreateChat, + JoinChatRoom, + MessagePayload, } from './interface/chat.interface'; import { ChatListRepository } from './repository/chat-list.repository'; import { ChatUsersRepository } from './repository/chat-users.repository'; @@ -76,24 +78,28 @@ export class ChatService { throw new BadRequestException('채팅방 유저정보 생성 오류입니다.'); } - socket.join(roomName); + socket.join(`${chatRoomNo}`); } } catch (err) { throw err; } } - async joinRoom(socket, chat: CreateChat): Promise { + async joinRoom(socket, chat: JoinChatRoom): Promise { try { - const { userNo, meetingNo } = chat; - const userExist: ChatRoomUsers = - await this.chatListRepository.isUserInChatRoom(meetingNo, userNo); - if (!userExist) { - throw new BadRequestException('채팅방에 참여할 수 없습니다.'); + const { userNo, chatRoomNo } = chat; + const user: ChatRoomUsers = + await this.chatListRepository.isUserInChatRoom(chatRoomNo, userNo); + if (!user) { + throw new BadRequestException('채팅방에 유저의 정보가 없습니다.'); } - socket.join(userExist.roomName); - return userExist.nickname; + socket.join(`${user.chatRoomNo}`); + + socket.broadcast.to(`${user.chatRoomNo}`).emit('join-room', { + username: user.nickname, + msg: `${user.nickname}님이 접속하셨습니다.`, + }); } catch (err) { throw err; } @@ -111,6 +117,24 @@ export class ChatService { } } + async sendChat(socket, messagePayload: MessagePayload): Promise { + try { + const { userNo, chatRoomNo, message } = messagePayload; + + const user: ChatRoomUsers = + await this.chatListRepository.isUserInChatRoom(chatRoomNo, userNo); + if (!user) { + throw new BadRequestException('채팅방에 유저의 정보가 없습니다.'); + } + socket.broadcast.to(`${chatRoomNo}`).emit('message', { + message, + userNo, + }); + } catch (err) { + throw err; + } + } + private async getUserByMeetingNo(meetingNo): Promise { try { const chatRoom: ChatRoom = diff --git a/main-project/src/chats/interface/chat.interface.ts b/main-project/src/chats/interface/chat.interface.ts index 50b4c2bb..93fef4b7 100644 --- a/main-project/src/chats/interface/chat.interface.ts +++ b/main-project/src/chats/interface/chat.interface.ts @@ -6,12 +6,12 @@ export interface CreateChat { export interface JoinChatRoom { userNo: number; - meetingNo: number; + chatRoomNo: number; } export interface MessagePayload { message?: string; - meetingNo: number; + chatRoomNo: number; userNo: number; } @@ -25,6 +25,7 @@ export interface ChatRoom { } export interface ChatRoomUsers { + chatRoomNo: number; nickname: string; roomName: string; meetingNo: number; diff --git a/main-project/src/chats/repository/chat-list.repository.ts b/main-project/src/chats/repository/chat-list.repository.ts index c72c8085..5b81d2ae 100644 --- a/main-project/src/chats/repository/chat-list.repository.ts +++ b/main-project/src/chats/repository/chat-list.repository.ts @@ -36,18 +36,18 @@ export class ChatListRepository extends Repository { } } - async isUserInChatRoom(meetingNo, userNo): Promise { + async isUserInChatRoom(chatRoomNo, userNo): Promise { try { const result = await this.createQueryBuilder('chat_list') .leftJoin('chat_list.chatUserNo', 'chatUserNo') .leftJoin('chatUserNo.userNo', 'userNo') .select([ 'chat_list.room_name AS roomName', - 'chat_list.meeting_no AS meetingNo', + 'chat_list.no AS chatRoomNo', 'chatUserNo.user_no AS userNo', 'userNo.nickname AS nickname', ]) - .where(`chat_list.meeting_no = :meetingNo`, { meetingNo }) + .where(`chat_list.no = :chatRoomNo`, { chatRoomNo }) .andWhere('chatUserNo.user_no = :userNo', { userNo }) .getRawOne(); return result;