|
| 1 | +import { |
| 2 | + SubscribeMessage, |
| 3 | + WebSocketGateway, |
| 4 | + WebSocketServer, |
| 5 | + OnGatewayDisconnect, |
| 6 | + OnGatewayConnection, |
| 7 | +} from '@nestjs/websockets'; |
| 8 | +import { Server, Socket } from 'socket.io'; |
| 9 | +import { ChatRoomService } from './chat-room/chat-room.service'; |
| 10 | +import { ChatMessageService } from './chat-message/chat-message.service'; |
| 11 | + |
| 12 | +//클라이언트의 패킷들이 게이트웨이를 통해서 들어오게 됩니다. |
| 13 | +@WebSocketGateway({ namespace: '/chatting', cors: { origin: '*' } }) |
| 14 | +export class EventsGateway implements OnGatewayConnection, OnGatewayDisconnect { |
| 15 | + // 소켓 서버를 정의합니다. |
| 16 | + @WebSocketServer() |
| 17 | + server: Server; |
| 18 | + // 유저 정보를 레디스에 적재시키기 위해서 레디스 설정이 선행되야합니다. |
| 19 | + constructor( |
| 20 | + private readonly chatRoomService: ChatRoomService, |
| 21 | + private readonly chatMessageService: ChatMessageService, |
| 22 | + ) {} |
| 23 | + |
| 24 | + afterInit(server: Server) { |
| 25 | + console.log('Initialized', server.engine.clientsCount); |
| 26 | + } |
| 27 | + |
| 28 | + handleConnection(client: Socket) { |
| 29 | + console.log(`Client connected: ${client.id}`); |
| 30 | + } |
| 31 | + |
| 32 | + handleDisconnect(client: Socket) { |
| 33 | + console.log(`Client disconnected: ${client.id}`); |
| 34 | + } |
| 35 | + |
| 36 | + @SubscribeMessage('getChatRooms') |
| 37 | + async handleGetChatRooms(client: Socket, userId: number) { |
| 38 | + const chatRooms = |
| 39 | + await this.chatRoomService.getChatRoomsWithLatestMessage(userId); |
| 40 | + client.emit('chatRoomList', chatRooms); |
| 41 | + } |
| 42 | + |
| 43 | + @SubscribeMessage('sendMessage') |
| 44 | + async handleSendMessage( |
| 45 | + client: Socket, |
| 46 | + payload: { |
| 47 | + chatRoomId: number; |
| 48 | + toUserId: number; |
| 49 | + message: string; |
| 50 | + fromUserId: number; |
| 51 | + createdAt: string; |
| 52 | + }, |
| 53 | + ) { |
| 54 | + const { chatRoomId, toUserId, message, fromUserId, createdAt } = payload; |
| 55 | + |
| 56 | + // 메시지 저장 로직 |
| 57 | + const newMessage = await this.chatMessageService.saveMessage( |
| 58 | + chatRoomId, |
| 59 | + toUserId, |
| 60 | + message, |
| 61 | + fromUserId, |
| 62 | + createdAt, |
| 63 | + ); |
| 64 | + |
| 65 | + // 채팅방 리스트 업데이트 |
| 66 | + const chatRooms = |
| 67 | + await this.chatRoomService.getChatRoomsWithLatestMessage(fromUserId); |
| 68 | + client.emit('chatRoomList', chatRooms); |
| 69 | + |
| 70 | + // 해당 채팅방에 있는 모든 사용자에게 메시지 전송 |
| 71 | + this.server.to(String(chatRoomId)).emit('newMessage', newMessage); |
| 72 | + } |
| 73 | + |
| 74 | + @SubscribeMessage('getChatRoomMessages') |
| 75 | + async handleGetChatRoomMessages(client: Socket, chatRoomId: number) { |
| 76 | + const messages = |
| 77 | + await this.chatMessageService.getMessagesByChatRoomId(chatRoomId); |
| 78 | + client.emit('chatRoomMessages', messages); // 클라이언트에 메시지 리스트 전송 |
| 79 | + } |
| 80 | + |
| 81 | + @SubscribeMessage('joinChatRoom') |
| 82 | + handleJoinChatRoom(client: Socket, chatRoomId: number) { |
| 83 | + client.join(String(chatRoomId)); |
| 84 | + } |
| 85 | +} |
0 commit comments