diff --git a/backend/shared/interfaces/ChatRoom.ts b/backend/shared/interfaces/ChatRoom.ts deleted file mode 100644 index 89230b7c..00000000 --- a/backend/shared/interfaces/ChatRoom.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class ChatRoom { - roomName: string; - userIdList: number[]; -} \ No newline at end of file diff --git a/backend/shared/interfaces/UserWebsockets.ts b/backend/shared/interfaces/UserWebsockets.ts new file mode 100644 index 00000000..0e141bab --- /dev/null +++ b/backend/shared/interfaces/UserWebsockets.ts @@ -0,0 +1,4 @@ +export class UsersWebsockets { + userId: number; + socketId: string; +} diff --git a/backend/src/chat/chat.gateway.ts b/backend/src/chat/chat.gateway.ts index 7209dc68..8ea29b55 100644 --- a/backend/src/chat/chat.gateway.ts +++ b/backend/src/chat/chat.gateway.ts @@ -6,6 +6,9 @@ import { import { ConnectedSocket, MessageBody, + OnGatewayConnection, + OnGatewayDisconnect, + OnGatewayInit, SubscribeMessage, WebSocketGateway, WebSocketServer, @@ -40,7 +43,7 @@ async function passwordCompare( transport: ['websocket'], cors: '*/*', }) -export class ChatGateway { +export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect { private channelLobby = 'channelLobby'; constructor( private readonly chatService: ChatService, @@ -49,7 +52,27 @@ export class ChatGateway { @WebSocketServer() server: Server; + async handleConnection(@ConnectedSocket() client: Socket) { + const user = await this.chatService.getUserFromSocket(client); + const isRegistered = ChatService.userWebsockets.find( + (element) => element.userId === user.id, + ); + + if (!isRegistered) { + const newWebsocket = { userId: user.id, socketId: client.id }; + ChatService.userWebsockets = [ + ...ChatService.userWebsockets, + newWebsocket, + ]; + } + } + + handleDisconnect(@ConnectedSocket() client: Socket) { + ChatService.userWebsockets = ChatService.userWebsockets.filter( + (websocket) => websocket.socketId !== client.id, + ); + } /* JOIN CHANNEL LOBBY */ @UseGuards(JwtWsGuard) @SubscribeMessage(ROUTES_BASE.CHAT.JOIN_CHANNEL_LOBBY_REQUEST) @@ -174,6 +197,20 @@ export class ChatGateway { await client.join(newDMRoom.roomName); + const receiverSocketId = this.chatService.getUserIdWebsocket(friendId); + + if (receiverSocketId) { + /** Retrieve receiver's socket with the socket ID + * https://stackoverflow.com/questions/67361211/socket-io-4-0-1-get-socket-by-id + */ + + const receiverSocket = this.server.sockets.sockets.get( + receiverSocketId.socketId, + ); + + await receiverSocket.join(newDMRoom.roomName); + } + this.server .in(newDMRoom.roomName) .emit(ROUTES_BASE.CHAT.CONFIRM_DM_CHANNEL_CREATION, { diff --git a/backend/src/chat/chat.service.ts b/backend/src/chat/chat.service.ts index aa1d78d8..aff8d50f 100644 --- a/backend/src/chat/chat.service.ts +++ b/backend/src/chat/chat.service.ts @@ -1,6 +1,6 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { AuthService } from '../auth/auth.service'; -import { Socket } from 'socket.io'; +import { Server, Socket } from 'socket.io'; import { parse } from 'cookie'; import { WsException } from '@nestjs/websockets'; import { InjectRepository } from '@nestjs/typeorm'; @@ -10,7 +10,7 @@ import { User } from 'src/user/user.entity'; import Room from './room.entity'; import { UsersService } from 'src/user/user.service'; import { v4 as uuidv4 } from 'uuid'; -import { ChatRoom } from 'shared/interfaces/ChatRoom'; +import { UsersWebsockets } from 'shared/interfaces/UserWebsockets'; import ChannelData from 'shared/interfaces/ChannelData'; @Injectable() export class ChatService { @@ -24,7 +24,7 @@ export class ChatService { private usersRepository: Repository, private userService: UsersService, ) {} - private static chatRoomList: ChatRoom[] = []; + public static userWebsockets: UsersWebsockets[] = []; public async getAllPublicRooms(): Promise { return this.roomsRepository @@ -246,18 +246,9 @@ export class ChatService { return user; } - //Unused fct - removeUserConnectedToRooms(roomName: string, userId): number[] { - const chatRoomIndex = ChatService.chatRoomList.findIndex( - (chatRoom) => chatRoom.roomName == roomName, + getUserIdWebsocket(receiverId: number): UsersWebsockets | undefined { + return ChatService.userWebsockets.find( + (receiver) => receiver.userId === receiverId, ); - if (ChatService.chatRoomList[chatRoomIndex].userIdList.includes(userId)) { - ChatService.chatRoomList[chatRoomIndex].userIdList = - ChatService.chatRoomList[chatRoomIndex].userIdList.filter( - (id) => id !== userId, - ); - } - return ChatService.chatRoomList[chatRoomIndex].userIdList; } - /** END ChatRoomConnectedUsers methods */ }