Skip to content

Commit

Permalink
Merge pull request #110 from Kimsoo0119/feature-chat
Browse files Browse the repository at this point in the history
Add/Refactor(hyunsoo/chat): 채팅기능 구현 완료/ 채팅방 접속 로직 수정 meetingNo -> cha…
  • Loading branch information
Kimsoo0119 authored Oct 21, 2022
2 parents 9474510 + 26bfd38 commit acf8168
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 24 deletions.
23 changes: 13 additions & 10 deletions main-project/src/chats/chats.gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -63,24 +67,23 @@ 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) {
throw err;
}
}

@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;
}
}
}
42 changes: 33 additions & 9 deletions main-project/src/chats/chats.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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<string> {
async joinRoom(socket, chat: JoinChatRoom): Promise<void> {
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;
}
Expand All @@ -111,6 +117,24 @@ export class ChatService {
}
}

async sendChat(socket, messagePayload: MessagePayload): Promise<void> {
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<ChatRoom> {
try {
const chatRoom: ChatRoom =
Expand Down
5 changes: 3 additions & 2 deletions main-project/src/chats/interface/chat.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -25,6 +25,7 @@ export interface ChatRoom {
}

export interface ChatRoomUsers {
chatRoomNo: number;
nickname: string;
roomName: string;
meetingNo: number;
Expand Down
6 changes: 3 additions & 3 deletions main-project/src/chats/repository/chat-list.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,18 @@ export class ChatListRepository extends Repository<ChatList> {
}
}

async isUserInChatRoom(meetingNo, userNo): Promise<ChatRoomUsers> {
async isUserInChatRoom(chatRoomNo, userNo): Promise<ChatRoomUsers> {
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;
Expand Down

0 comments on commit acf8168

Please sign in to comment.