From 6be1f32fa8d19715f412bf38ef4ab85b6887a165 Mon Sep 17 00:00:00 2001 From: simplonco Date: Thu, 12 Jan 2023 11:25:14 +0100 Subject: [PATCH 01/40] directs have good names and cannot leave server side --- README.md | 4 +- .../api_back/src/chat/chat.controller.ts | 30 ++++++--------- .../nestjs/api_back/src/chat/chat.service.ts | 12 +++--- .../nestjs/api_back/src/chat/dto/room.dto.ts | 8 ++++ .../src/pieces/chat/Layout_home.svelte | 2 +- .../src/pieces/chat/Layout_room_set.svelte | 8 ++-- .../src/pieces/chat/Request_rooms.ts | 38 ++++++++++++------- .../api_front/src/pieces/chat/Store_chat.ts | 1 + 8 files changed, 60 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index c952c5ab..5459bbea 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,11 @@ - [/] chat in room - [/] join public rooms - [ ] join private rooms -- [ ] join direct rooms +- [/] join direct rooms - [/] see all joignable rooms - [/] see all my rooms - [/] leave room -- [ ] leave direct +- [ ] leave direct impossible - [ ] invite someone in room - [ ] make admin - [ ] ban diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 12c8a9b1..4e6d2131 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -49,7 +49,6 @@ export class ChatController { console.log("- in getAllRooms controller"); const rooms: roomDto[] = await this.chatService.getAllOtherRoomsAndUsers(req.user.username) - console.log("--- rooms:", rooms); res.status(HttpStatus.OK).json({ rooms: rooms }); console.log("- out getAllRooms controller"); @@ -96,6 +95,8 @@ export class ChatController { throw new HttpException(`Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); } + room.users = [req.user.username]; + room.owner = req.user.username; await this.chatService.addUserToNewRoom(req.user.username, room); res.status(HttpStatus.OK).json({ room: room }); @@ -117,13 +118,15 @@ export class ChatController { room.type = 'direct'; room.users = [room.name, req.user.username]; room.name += ` + ${req.user.username}`; + room.owner = req.user.username; await this.chatService.addUserToNewRoom(req.user.username, room); } else - await this.chatService.addUserToRoom(req.user.username, room.name); + room = await this.chatService.addUserToRoom(req.user.username, room.name); let socket: socketDto = this.chatGateway.sockets.get(req.user.username); await this.chatService.socketJoinRoom(socket, room.name); + res.status(HttpStatus.OK).json({ room: room }); console.log("- out joinRoom controller"); @@ -146,10 +149,15 @@ export class ChatController { @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - @Post('leave') - async leaveRoom(@Body() body) + @Delete('leave') + async leaveRoom(@Req() req, @Res() res): Promise { console.log("- in leaveRoom controller"); + + const room_name = await this.chatService.getCurrentRoomName(req.user.username); + let response = await this.chatService.removeUserFromRoom(req.user.username, room_name); + res.status(HttpStatus.OK).json({ message: response }); + console.log("- out leaveRoom controller"); } @@ -181,19 +189,5 @@ export class ChatController { console.log("- out getRoomUsers controller"); } - @UseGuards(AuthenticateGuard) - @UseGuards(TwoFactorGuard) - @Delete('removeuser') - async removeUser(@Req() req, @Res() res): Promise - { - console.log("- in removeUser controller"); - - const room_name = await this.chatService.getCurrentRoomName(req.user.username); - let response = await this.chatService.removeUserFromRoom(req.user.username, room_name); - res.status(HttpStatus.OK).json({ message: response }); - - console.log("- out removeUser controller"); - } - } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index a59720db..6e12e9da 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -82,6 +82,7 @@ export class ChatService { const rooms = await this.chatroomRepository .createQueryBuilder('chatroom') .where('chatroom.type != :type', { type: 'private' }) + .andWhere('chatroom.type != :type', { type: 'direct' }) .andWhere('chatroom.users NOT LIKE :user_name', { user_name: `%${username}%` }) .getMany(); console.log("--- rooms:", rooms); @@ -200,17 +201,15 @@ export class ChatService { const newChatroom = new Chatroom(); newChatroom.name = room.name; newChatroom.type = room.type; - newChatroom.owner = username; - newChatroom.users = [username]; - if (room.type === 'direct') - newChatroom.users = room.users; + newChatroom.owner = room.owner; + newChatroom.users = room.users; newChatroom.messages = [{ name: "SERVER", message: `creation of room ${room.name}` }]; await this.chatroomRepository.save(newChatroom); console.log("-- out addUserToNewRoom service"); } - async addUserToRoom(username: string, room_name: string): Promise + async addUserToRoom(username: string, room_name: string): Promise { console.log("-- in addUserToRoom service"); @@ -223,6 +222,7 @@ export class ChatService { this.chatroomRepository.save(room); console.log("-- out addUserToRoom service"); + return room; } async addMessageToRoom(room_name: string, username: string, message: string): Promise @@ -251,6 +251,8 @@ export class ChatService { const room = await this.getRoomByName(room_name); if (!room.users.includes(username)) throw new HttpException(`your are not in this room`, HttpStatus.CONFLICT); + if (room.type === "direct") + throw new HttpException(`you cannot leave a direct messages conversation`, HttpStatus.CONFLICT); // delete user from room room.users.push(username); diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index 6dcf8099..d98f3fe5 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -11,6 +11,14 @@ export class roomDto @IsIn(["public", "protected", "private", "direct", "user"]) type: string; + @IsString() + @IsOptional() + owner?: string; + + @IsString() + @IsOptional() + client_name?: string; + @IsArray() @IsString({ each: true }) @IsOptional() diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte index a341b6b1..679e5c5d 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte @@ -48,7 +48,7 @@ {:then rooms} {#each rooms as room} {/each} {/await} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte index 8e2933bf..d1cca48f 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte @@ -1,7 +1,7 @@ + +
+ + + + + + + + + + + + + + +
+

invite someone in this room :

+
+
+

/ there is no one to invite yet /

+
+ {#await users} +

users are loading...

+ {:then users} + {#each users as user} + + {/each} + {/await} +
+
+ +
+ + + diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte index 46f3bd20..c37a7210 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte @@ -45,6 +45,9 @@ + {/if}

room users :

diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index b795560b..aff3b5ed 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -134,4 +134,15 @@ export async function leave_room() }); } +export async function get_all_users() +{ + console.log("in get_all_users"); + + const response = await fetch('/api/v2/chat/users'); + const data = await response.json(); + console.log("users:", data.users); + + return data.users; +} + From a605a4a09e451b4b522f808079465c844284b6e2 Mon Sep 17 00:00:00 2001 From: simplonco Date: Thu, 12 Jan 2023 13:18:49 +0100 Subject: [PATCH 04/40] wip pbm join room return wrong room --- Makefile | 4 ++++ .../api_back/src/chat/chat.controller.ts | 2 +- .../src/pieces/chat/Request_rooms.ts | 19 ++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 27e3080f..dba718e5 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,10 @@ destroy: db: - docker rm -f postgresql - docker rm -f nestjs + #- docker rm -f redis + #- docker rm -f game_server + #- docker rm -f nginx + #- docker rm -f svelte - docker volume rm -f srcs_data_nest_postgresql docker compose -f ${DOCKERCOMPOSEPATH} up -d --build @make start diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 00d4bb73..509003f8 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -139,7 +139,7 @@ export class ChatController { { console.log("- in changeRoom controller"); - const response = await this.chatService.setCurrentRoom(req.user.username, room.name); + await this.chatService.setCurrentRoom(req.user.username, room.name); let socket: socketDto = this.chatGateway.sockets.get(req.user.username); await this.chatService.socketChangeRoom(socket, room.name); res.status(HttpStatus.OK).json({ room: room }); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index aff3b5ed..b035d8e4 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -121,19 +121,11 @@ export async function get_room_users() const response = await fetch('/api/v2/chat/roomusers'); const data = await response.json(); + console.log("users:", data.users); return data.users; } -export async function leave_room() -{ - console.log("in leave_room"); - - const response = await fetch('/api/v2/chat/leave', { - method: 'DELETE', - }); -} - export async function get_all_users() { console.log("in get_all_users"); @@ -145,4 +137,13 @@ export async function get_all_users() return data.users; } +export async function leave_room() +{ + console.log("in leave_room"); + + const response = await fetch('/api/v2/chat/leave', { + method: 'DELETE', + }); +} + From a4b6d65fdf49b077b7f6dc433fe318040b748318 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Thu, 12 Jan 2023 16:15:22 +0100 Subject: [PATCH 05/40] join and change room bug fixed --- .../nestjs/api_back/src/chat/chat.service.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 0842a6d3..aa0e6b51 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -25,6 +25,18 @@ export class ChatService { return new Promise(resolve => setTimeout(resolve, ms)); } + private format_room(room: Chatroom) + { + let new_room: roomDto = { + name: room.name, + type: room.type, + owner: room.owner, + users: room.users, + }; + + return new_room; + } + /* GETTERS ************************************************ */ @@ -222,7 +234,7 @@ export class ChatService { this.chatroomRepository.save(room); console.log("-- out addUserToRoom service"); - return room; + return this.format_room(room); } async addMessageToRoom(room_name: string, username: string, message: string): Promise From 210e82269d5e1c158bb089a7f247305669a070fd Mon Sep 17 00:00:00 2001 From: hugogogo Date: Thu, 12 Jan 2023 18:07:56 +0100 Subject: [PATCH 06/40] wip invite people --- README.md | 2 +- .../nestjs/api_back/src/chat/chat.controller.ts | 15 +++++++++++++++ .../src/pieces/chat/Layout_invite.svelte | 9 +++++---- .../api_front/src/pieces/chat/Layout_user.svelte | 1 - .../api_front/src/pieces/chat/Request_rooms.ts | 12 ++++++++++++ 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8846b817..36738e75 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ - [ ] ban - [ ] mute - [ ] protect room with password -- [ ] bock users +- [ ] block users - [ ] send game invitation - [ ] view user profiles diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 509003f8..bc2a94c2 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -147,6 +147,21 @@ export class ChatController { console.log("- out changeRoom controller"); } + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Post('invite') + async inviteUser(@Body() username: string, @Req() req, @Res() res): Promise + { + console.log("- in inviteUser controller"); + + let current_room_name = await this.chatService.getCurrentRoomName(username); + await this.chatService.addUserToRoom(username, current_room_name); + + res.status(HttpStatus.OK); + + console.log("- out inviteUser controller"); + } + @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) @Delete('leave') diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte index 286ea76a..fee5c848 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte @@ -1,7 +1,7 @@
diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index b035d8e4..f32ce648 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -93,6 +93,18 @@ export async function change_room(room: Room) layout.set("room"); } +export async function invite_user(user_name: string) +{ + console.log("in invite_user"); + + const response = await fetch('/api/v2/chat/invite', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({username: user_name}), + }); + let data = await response.json(); +} + export async function get_my_rooms() { console.log("in get_my_rooms"); From 7e13dc3f614c1fe522bfa6b300c2c2739d784234 Mon Sep 17 00:00:00 2001 From: lperrey Date: Thu, 12 Jan 2023 19:52:28 +0100 Subject: [PATCH 07/40] /resetuserstatus when player leave the gameserver --- srcs/docker-compose.yml | 2 +- .../game_back/src/server/class/Client.ts | 4 +-- .../game_back/src/server/wsServer.ts | 27 ++++++++++++++++--- .../api_back/src/game/game.controller.ts | 5 ++++ .../nestjs/api_back/src/game/game.service.ts | 7 +++++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 3d6fa9c2..eadd2da2 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -26,7 +26,7 @@ services: volumes: - ./requirements/nestjs/api_back/src:/usr/app/src - ./requirements/nestjs/api_back/test:/usr/app/test/ - - nestjs_photos_volume:/usr/app/src/uploads/avatars + - nestjs_photos_volume:/usr/app/uploads/avatars restart: unless-stopped depends_on: - postgresql diff --git a/srcs/requirements/game_server/game_back/src/server/class/Client.ts b/srcs/requirements/game_server/game_back/src/server/class/Client.ts index 864472ec..67076fd3 100644 --- a/srcs/requirements/game_server/game_back/src/server/class/Client.ts +++ b/srcs/requirements/game_server/game_back/src/server/class/Client.ts @@ -6,6 +6,7 @@ import * as ev from "../../shared_js/class/Event.js" import * as en from "../../shared_js/enums.js" export class Client { + role: en.ClientRole; socket: WebSocket; id: string; // same as "socket.id" isAlive: boolean = true; @@ -23,9 +24,8 @@ export class ClientPlayer extends Client { inputBuffer: ev.EventInput = new ev.EventInput(); lastInputId: number = 0; racket: Racket; - constructor(socket: WebSocket, id: string, racket: Racket) { + constructor(socket: WebSocket, id: string) { super(socket, id); - this.racket = racket; } } diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index 35923df1..8af02ec6 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -76,6 +76,8 @@ async function clientAnnounceListener(this: WebSocket, data: string) if (msg.role === en.ClientRole.player) { const announce: ev.ClientAnnouncePlayer = msg; + const player = clientsMap.get(this.id) as ClientPlayer; + player.role = msg.role; const body = { playerOneUsername: announce.username, @@ -106,8 +108,6 @@ async function clientAnnounceListener(this: WebSocket, data: string) clientTerminate(clientsMap.get(this.id)); return; } - - const player = clientsMap.get(this.id) as ClientPlayer; player.matchOptions = announce.matchOptions; player.token = announce.token; player.username = announce.username; @@ -126,13 +126,15 @@ async function clientAnnounceListener(this: WebSocket, data: string) else if (msg.role === en.ClientRole.spectator) { const announce: ev.ClientAnnounceSpectator = msg; + const spectator = clientsMap.get(this.id) as ClientSpectator; + spectator.role = msg.role; + const gameSession = gameSessionsMap.get(announce.gameSessionId); if (!gameSession) { this.send(JSON.stringify( new ev.EventError("invalid gameSessionId") )); clientTerminate(clientsMap.get(this.id)); return; } - const spectator = clientsMap.get(this.id) as ClientSpectator; spectator.gameSession = gameSession; gameSession.spectatorsMap.set(spectator.id, spectator); spectator.socket.once("message", spectatorReadyConfirmationListener); @@ -419,7 +421,7 @@ const pingInterval = setInterval( () => { }, 4200); -export function clientTerminate(client: Client) +export async function clientTerminate(client: Client) { client.socket.terminate(); if (client.gameSession) @@ -439,6 +441,23 @@ export function clientTerminate(client: Client) else if (privateMatchmakingMap.has(client.id)) { privateMatchmakingMap.delete(client.id); } + + if (client.role === en.ClientRole.player) + { + const player = client as ClientPlayer; + console.log("/resetuserstatus " + player.username); + const response = await fetch(c.addressBackEnd + "/game/gameserver/resetuserstatus", + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({username: player.username}) + }); + if (!response.ok) { + console.log("/resetuserstatus " + player.username + " failed"); + } + } } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index b393eaf5..57a87978 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -101,4 +101,9 @@ export class GameController { { return this.gameService.destroySession(token); } + + @Post('gameserver/resetuserstatus') + async resetUserStatus(@Body('username') username){ + this.gameService.resetStatus(username); + } } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index a6f7cd02..7f7f53e7 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -300,5 +300,12 @@ export class GameService { this.userService.updateStatus(playerTwo.id, STATUS.CONNECTED) return HttpStatus.OK } + + async resetStatus(username : string){ + const user : User = await this.userRepository.findOneBy({username : username}) + if (!user) + return HttpStatus.NOT_FOUND; + this.userService.updateStatus(user.id, STATUS.CONNECTED); + } } From 41711a75f2a420d4cc9f7c5c78aaccddca9d53fd Mon Sep 17 00:00:00 2001 From: hugogogo Date: Thu, 12 Jan 2023 20:12:06 +0100 Subject: [PATCH 08/40] wip invite, and join room gives 2 messages --- .../api_back/src/chat/chat.controller.ts | 4 ++-- .../nestjs/api_back/src/chat/chat.service.ts | 19 ++++++++++++------- .../src/pieces/chat/Layout_invite.svelte | 7 ++----- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index bc2a94c2..2ab6cd17 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -150,11 +150,11 @@ export class ChatController { @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) @Post('invite') - async inviteUser(@Body() username: string, @Req() req, @Res() res): Promise + async inviteUser(@Body('username') username: string, @Req() req, @Res() res): Promise { console.log("- in inviteUser controller"); - let current_room_name = await this.chatService.getCurrentRoomName(username); + let current_room_name = await this.chatService.getCurrentRoomName(req.user.username); await this.chatService.addUserToRoom(username, current_room_name); res.status(HttpStatus.OK); diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index aa0e6b51..7bbaa751 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -147,7 +147,9 @@ export class ChatService { { console.log("-- in getCurrentRoomName service"); + console.log("username:", username); const user_db = await this.getUserByName(username); + console.log("user_db:", user_db); console.log("-- out getCurrentRoomName service"); return user_db.currentRoom; @@ -157,11 +159,12 @@ export class ChatService { { console.log("-- in getRoomByName service"); + console.log("room_name:", room_name); const room = await this.chatroomRepository .createQueryBuilder('chatroom') .where('chatroom.name = :name', { name: room_name }) .getOne(); - console.log("--- room:", room); + console.log("room:", room); console.log("-- out getRoomByName service"); return room; @@ -175,7 +178,6 @@ export class ChatService { .createQueryBuilder('chatroom') .where('chatroom.id = :id', { id: id }) .getOne(); - console.log("--- room:", room); console.log("-- out getRoomById service"); return room; @@ -192,7 +194,7 @@ export class ChatService { const user_db = await this.getUserByName(username); user_db.currentRoom = room_name; this.userRepository.save(user_db); - + console.log("-- out setCurrentRoom service"); return `room "${room_name}" is now current room`; } @@ -210,12 +212,15 @@ export class ChatService { throw new HttpException(`This room name already exist`, HttpStatus.CONFLICT); // create chatroom - const newChatroom = new Chatroom(); + let newChatroom = new Chatroom(); newChatroom.name = room.name; newChatroom.type = room.type; newChatroom.owner = room.owner; newChatroom.users = room.users; - newChatroom.messages = [{ name: "SERVER", message: `creation of room ${room.name}` }]; + newChatroom.messages = [ + { name: "SERVER", message: `creation of room ${room.name}` }, + { name: "SERVER", message: `${room.users[0]} joined the room` }, + ]; await this.chatroomRepository.save(newChatroom); console.log("-- out addUserToNewRoom service"); @@ -231,6 +236,7 @@ export class ChatService { // update room with new user room.users.push(username); + room.messages.push({ name: "SERVER", message: `${username} joined the room`}); this.chatroomRepository.save(room); console.log("-- out addUserToRoom service"); @@ -290,7 +296,6 @@ export class ChatService { .createQueryBuilder('user') .where('user.username = :name', { name: username }) .getOne(); - console.log("--- user:", user); console.log("-- out getUserByName service"); return user; @@ -372,7 +377,7 @@ export class ChatService { socket.leave(socket.room); socket.join(room_name); socket.room = room_name; - let message = `${socket.username} has join the room`; + let message = `${socket.username} joined the room`; await socket.to(socket.room).emit('message', "SERVER", message); await this.addMessageToRoom(room_name, "SERVER", message); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte index fee5c848..b2f7abf7 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte @@ -13,11 +13,8 @@ { console.log("inside invite_this_user"); - await invite_user(username); -// console.log("room:", room); -// const updated_room = await join_room(room); -// console.log("updated room:", updated_room); -// await change_room(updated_room); + invite_user(username); + layout.set("room"); } From 27bbb6346fb2125e12f4d7c08e115bb7804b6125 Mon Sep 17 00:00:00 2001 From: simplonco Date: Fri, 13 Jan 2023 00:08:00 +0100 Subject: [PATCH 09/40] invitation is working --- README.md | 3 +-- .../nestjs/api_back/src/chat/chat.controller.ts | 4 ++-- .../requirements/nestjs/api_back/src/chat/chat.service.ts | 8 ++++---- .../svelte/api_front/src/pieces/chat/Request_rooms.ts | 2 ++ 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 36738e75..5b91f68c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ - ### Pour lancer le docker : - Il faut un fichier .env qu'on ne doit pas push, donc je ne le push pas. @@ -79,7 +78,7 @@ - [/] see all my rooms - [/] leave room - [/] leave direct impossible -- [ ] invite someone in room +- [/] invite someone in room - [ ] make admin - [ ] ban - [ ] mute diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 2ab6cd17..447cf073 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -155,9 +155,9 @@ export class ChatController { console.log("- in inviteUser controller"); let current_room_name = await this.chatService.getCurrentRoomName(req.user.username); - await this.chatService.addUserToRoom(username, current_room_name); + let room = await this.chatService.addUserToRoom(username, current_room_name); - res.status(HttpStatus.OK); + res.status(HttpStatus.OK).json({ room: room }); console.log("- out inviteUser controller"); } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 7bbaa751..776c6a5d 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -193,7 +193,7 @@ export class ChatService { const user_db = await this.getUserByName(username); user_db.currentRoom = room_name; - this.userRepository.save(user_db); + await this.userRepository.save(user_db); console.log("-- out setCurrentRoom service"); return `room "${room_name}" is now current room`; @@ -237,7 +237,7 @@ export class ChatService { // update room with new user room.users.push(username); room.messages.push({ name: "SERVER", message: `${username} joined the room`}); - this.chatroomRepository.save(room); + await this.chatroomRepository.save(room); console.log("-- out addUserToRoom service"); return this.format_room(room); @@ -253,7 +253,7 @@ export class ChatService { message: message, }; my_room.messages.push(chat_message); - this.chatroomRepository.save(my_room); + await this.chatroomRepository.save(my_room); console.log("-- out addMessageToRoom service"); } @@ -275,7 +275,7 @@ export class ChatService { // delete user from room room.users.push(username); room.users = room.users.filter(name => name !== username); - this.chatroomRepository.save(room); + await this.chatroomRepository.save(room); // set current room to nothing await this.setCurrentRoom(username, ""); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index f32ce648..bd777b16 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -103,6 +103,8 @@ export async function invite_user(user_name: string) body: JSON.stringify({username: user_name}), }); let data = await response.json(); + + await get_room_messages(); } export async function get_my_rooms() From 23d1810226558b4a048cd6de3145f85d5ecefc98 Mon Sep 17 00:00:00 2001 From: simplonco Date: Fri, 13 Jan 2023 01:07:39 +0100 Subject: [PATCH 10/40] wip private --- .../nestjs/api_back/src/chat/dto/room.dto.ts | 2 +- .../src/chat/entities/chatroom.entity.ts | 2 +- .../src/pieces/chat/Layout_create.svelte | 36 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index d98f3fe5..ff21768e 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -8,7 +8,7 @@ export class roomDto @IsString() @IsNotEmpty() - @IsIn(["public", "protected", "private", "direct", "user"]) + @IsIn(["public", "private", "direct", "user"]) type: string; @IsString() diff --git a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts index 89e8ff18..2b5cf25f 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts @@ -18,7 +18,7 @@ export class Chatroom @Column() @IsString() @IsNotEmpty() - @IsIn(["public", "protected", "private", "direct", "user"]) + @IsIn(["public", "private", "direct", "user"]) type: string; @Column() diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index a68b70f6..f1f7de90 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -20,6 +20,7 @@ let room_name: string; let room_type: string; + let is_protected = false; let room_password: string; let response = { status: 0, @@ -82,21 +83,19 @@ -
+ {#if matchList.length !== 0} From feb00afceddad1e0bc7c9dda883125d17a2e51b0 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Fri, 13 Jan 2023 17:53:02 +0100 Subject: [PATCH 19/40] wip password --- README.md | 2 +- .../nestjs/api_back/package-lock.json | 521 +++++++++++++++++- .../requirements/nestjs/api_back/package.json | 2 + .../api_back/src/chat/chat.controller.ts | 43 +- .../nestjs/api_back/src/chat/chat.service.ts | 23 +- .../nestjs/api_back/src/chat/dto/room.dto.ts | 8 + .../src/chat/entities/chatroom.entity.ts | 9 + 7 files changed, 575 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 1fddbbc2..139ca496 100644 --- a/README.md +++ b/README.md @@ -80,10 +80,10 @@ - [/] invite someone in room - [/] leave room - [/] leave direct impossible +- [ ] protect room with password - [ ] make admin - [ ] ban - [ ] mute -- [ ] protect room with password - [ ] block users - [ ] send game invitation - [ ] view user profiles diff --git a/srcs/requirements/nestjs/api_back/package-lock.json b/srcs/requirements/nestjs/api_back/package-lock.json index c3e88cfb..e9fa4b5d 100644 --- a/srcs/requirements/nestjs/api_back/package-lock.json +++ b/srcs/requirements/nestjs/api_back/package-lock.json @@ -20,6 +20,7 @@ "@nestjs/websockets": "^9.2.1", "@types/express-session": "^1.17.5", "@types/validator": "^13.7.9", + "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", "connect-redis": "^6.1.3", @@ -44,6 +45,7 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/bcrypt": "^5.0.0", "@types/express": "^4.17.13", "@types/jest": "28.1.8", "@types/multer": "^1.4.7", @@ -1455,6 +1457,25 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@nestjs/cli": { "version": "9.1.5", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", @@ -2156,6 +2177,15 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -2772,6 +2802,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2823,6 +2858,17 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", @@ -2945,6 +2991,36 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3129,6 +3205,19 @@ "node": ">=6.0.0" } }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3425,6 +3514,14 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -3643,6 +3740,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3702,6 +3807,11 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3877,6 +3987,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -3904,6 +4019,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4887,6 +5010,28 @@ "node": ">=12" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -4917,6 +5062,25 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -5090,6 +5254,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -5128,6 +5297,18 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -6574,7 +6755,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6610,7 +6790,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -6625,7 +6804,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -6764,6 +6942,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6850,6 +7062,11 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -6890,6 +7107,20 @@ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6911,6 +7142,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -8155,7 +8397,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -8306,8 +8547,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -8630,6 +8870,33 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -9530,6 +9797,14 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -10831,6 +11106,22 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, "@nestjs/cli": { "version": "9.1.5", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", @@ -11331,6 +11622,15 @@ "@babel/types": "^7.3.0" } }, + "@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -11858,6 +12158,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -11893,6 +12198,14 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", @@ -11975,6 +12288,32 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -12111,6 +12450,15 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, + "bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -12320,6 +12668,11 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -12482,6 +12835,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -12529,6 +12887,11 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -12659,6 +13022,11 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -12676,6 +13044,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -13439,6 +13812,24 @@ "universalify": "^2.0.0" } }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -13462,6 +13853,22 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, "generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -13581,6 +13988,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -13610,6 +14022,15 @@ "toidentifier": "1.0.1" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -14694,7 +15115,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -14718,7 +15138,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" }, @@ -14726,8 +15145,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -14829,6 +15247,33 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -14906,6 +15351,11 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -14935,6 +15385,14 @@ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -14950,6 +15408,17 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -15848,7 +16317,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -15973,8 +16441,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -16223,6 +16690,26 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -16784,6 +17271,14 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", diff --git a/srcs/requirements/nestjs/api_back/package.json b/srcs/requirements/nestjs/api_back/package.json index 4e8c4666..2c8a47da 100644 --- a/srcs/requirements/nestjs/api_back/package.json +++ b/srcs/requirements/nestjs/api_back/package.json @@ -32,6 +32,7 @@ "@nestjs/websockets": "^9.2.1", "@types/express-session": "^1.17.5", "@types/validator": "^13.7.9", + "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", "connect-redis": "^6.1.3", @@ -56,6 +57,7 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/bcrypt": "^5.0.0", "@types/express": "^4.17.13", "@types/jest": "28.1.8", "@types/multer": "^1.4.7", diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 6fddcef1..82b0a21b 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -18,6 +18,21 @@ export class ChatController { private chatGateway: ChatGateway, ) {} + private format_room(room) + { + let new_room: roomDto = { + name: room.name, + type: room.type, + }; + if (room.owner) + new_room.owner = room.owner; + if (room.users) + new_room.users = room.users; + if (room.protection) + new_room.protection = room.protection; + return new_room; + } + // don't allow '+' because it's used in direct rooms name private allowed_chars = '-#!?_'; private escape_chars(str) @@ -36,7 +51,8 @@ export class ChatController { let fields = ["name", "type", "users"]; const rooms = await this.chatService.getMyRooms(req.user.username, fields); - res.status(HttpStatus.OK).json({ rooms: rooms }); + const ret_rooms = rooms.map(room => this.format_room(room)); + res.status(HttpStatus.OK).json({ rooms: ret_rooms }); console.log("- out getMyRooms controller"); } @@ -49,7 +65,9 @@ export class ChatController { console.log("- in getAllRooms controller"); const rooms: roomDto[] = await this.chatService.getAllOtherRoomsAndUsers(req.user.username) - res.status(HttpStatus.OK).json({ rooms: rooms }); + + const ret_rooms = rooms.map(room => this.format_room(room)); + res.status(HttpStatus.OK).json({ rooms: ret_rooms }); console.log("- out getAllRooms controller"); } @@ -86,6 +104,7 @@ export class ChatController { { console.log("- in createRoom controller"); + // check chars in room name let chars = this.escape_chars(this.allowed_chars); let regex_base = `[a-zA-Z0-9\\s${chars}]`; let test_regex = new RegExp(`^${regex_base}+$`); @@ -95,10 +114,16 @@ export class ChatController { throw new HttpException(`Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); } + if (!room.password || room.password.length === 0) + room.protection = false; + else + room.protection = true; room.users = [req.user.username]; room.owner = req.user.username; await this.chatService.addUserToNewRoom(req.user.username, room); - res.status(HttpStatus.OK).json({ room: room }); + + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); console.log("- out createRoom controller"); } @@ -121,7 +146,7 @@ export class ChatController { } else { - let fields = ["name", "type", "users", "messages", "owner"]; + let fields = ["name", "type", "users", "messages", "owner", "protection"]; const room_db = await this.chatService.getRoomByName(room.name, fields); if (room_db.type === 'direct') { @@ -144,7 +169,8 @@ export class ChatController { let socket: socketDto = this.chatGateway.sockets.get(req.user.username); await this.chatService.socketJoinRoom(socket, room.name); - res.status(HttpStatus.OK).json({ room: room }); + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); console.log("- out joinRoom controller"); } @@ -159,7 +185,9 @@ export class ChatController { await this.chatService.setCurrentRoom(req.user.username, room.name); let socket: socketDto = this.chatGateway.sockets.get(req.user.username); await this.chatService.socketChangeRoom(socket, room.name); - res.status(HttpStatus.OK).json({ room: room }); + + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); console.log("- out changeRoom controller"); } @@ -176,7 +204,8 @@ export class ChatController { let message = `${username} joined the room`; await this.chatService.addMessageToRoom(current_room_name, "SERVER", message); - res.status(HttpStatus.OK).json({ room: room }); + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); console.log("- out inviteUser controller"); } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 7e0ab1a2..2e535d3f 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -7,6 +7,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { roomDto } from './dto/room.dto'; import { messagesDto } from './dto/messages.dto'; import { socketDto } from './dto/socket.dto'; +import * as bcrypt from 'bcrypt'; @Injectable() @@ -25,18 +26,6 @@ export class ChatService { return new Promise(resolve => setTimeout(resolve, ms)); } - private format_room(room: Chatroom) - { - let new_room: roomDto = { - name: room.name, - type: room.type, - owner: room.owner, - users: room.users, - }; - - return new_room; - } - /* GETTERS ************************************************ */ @@ -225,12 +214,22 @@ export class ChatService { throw new HttpException(`This room name already exist`, HttpStatus.CONFLICT); } + let hash; + if (room.protection) + { + const saltOrRounds = 10; + const password = room.password; + hash = await bcrypt.hash(password, saltOrRounds); + } + // create chatroom let newChatroom = new Chatroom(); newChatroom.name = room.name; newChatroom.type = room.type; newChatroom.owner = room.owner; newChatroom.users = room.users; + if (room.protection) + newChatroom.hash = hash; newChatroom.messages = [ { name: "SERVER", message: `creation of room ${room.name}` }, { name: "SERVER", message: `${room.users[0]} joined the room` }, diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index 9508575c..c6e09176 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -16,6 +16,14 @@ export class roomDto @IsIn(["public", "private", "direct", "user"]) type: string; + @IsBoolean() + @IsOptional() + protection?: boolean = false; + + @IsString() + @IsOptional() + password?: string; + @IsString() @IsOptional() owner?: string; diff --git a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts index 2b5cf25f..02a2bac6 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts @@ -21,6 +21,15 @@ export class Chatroom @IsIn(["public", "private", "direct", "user"]) type: string; + @Column({ default: false }) + @IsBoolean() + protection: boolean = false; + + @Column() + @IsString() + @IsOptional() + hash?: string; + @Column() owner: string; // username From ee98fdabc12ef329386713680ba34d85b882235f Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 00:26:25 +0100 Subject: [PATCH 20/40] wip protected room --- .../api_back/src/chat/chat.controller.ts | 23 ++++++++--- .../nestjs/api_back/src/chat/chat.service.ts | 38 +++++++++++++++--- .../nestjs/api_back/src/chat/dto/room.dto.ts | 5 +++ .../src/chat/entities/chatroom.entity.ts | 8 +++- .../src/pieces/chat/Layout_create.svelte | 2 + .../src/pieces/chat/Layout_new.svelte | 5 ++- .../src/pieces/chat/Layout_protected.svelte | 40 ++++++++++++++++++- .../src/pieces/chat/Request_rooms.ts | 4 +- 8 files changed, 109 insertions(+), 16 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 82b0a21b..4308c4cc 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -111,7 +111,8 @@ export class ChatController { if (test_regex.test(room.name) === false) { let forbidden_chars = room.name.replace(new RegExp(regex_base, "g"), ""); - throw new HttpException(`Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); + console.log(`throw error: Your room name can not contains these characters : ${forbidden_chars}`); + throw new HttpException( `Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); } if (!room.password || room.password.length === 0) @@ -119,7 +120,6 @@ export class ChatController { else room.protection = true; room.users = [req.user.username]; - room.owner = req.user.username; await this.chatService.addUserToNewRoom(req.user.username, room); const ret_room = this.format_room(room); @@ -151,17 +151,17 @@ export class ChatController { if (room_db.type === 'direct') { console.log("throw error: cannot join a direct messages room"); - throw new HttpException(`cannot join a direct messages room`, HttpStatus.CONFLICT); + throw new HttpException( `cannot join a direct messages room`, HttpStatus.CONFLICT); } if (room_db.type === 'private') { console.log("throw error: cannot join a private room"); - throw new HttpException(`cannot join a private room`, HttpStatus.CONFLICT); + throw new HttpException( `cannot join a private room`, HttpStatus.CONFLICT); } if (room_db.users.includes(req.user.username)) { console.log("throw error: your have already joined this room"); - throw new HttpException(`your have already joined this room`, HttpStatus.CONFLICT); + throw new HttpException( `your have already joined this room`, HttpStatus.CONFLICT); } room = await this.chatService.addUserToRoom(req.user.username, room.name); } @@ -182,6 +182,19 @@ export class ChatController { { console.log("- in changeRoom controller"); + let fields = ["protection", "allowed_users"]; + const room_db = await this.chatService.getRoomByName(room.name, fields); + if (room_db.protection === true) + { + if (!room.password) + { + console.log("throw error: code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); + throw new HttpException({ code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.BAD_REQUEST); + } + if (!room_db.allowed_users.contains(req.user.username)) + await this.chatService.setPasswordValidation(req.user.username, room); + } + await this.chatService.setCurrentRoom(req.user.username, room.name); let socket: socketDto = this.chatGateway.sockets.get(req.user.username); await this.chatService.socketChangeRoom(socket, room.name); diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 2e535d3f..18763305 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -199,6 +199,24 @@ export class ChatService { return `room "${room_name}" is now current room`; } + async setPasswordValidation(username: string, room: roomDto): Promise + { + console.log("-- in setPasswordValidation service"); + + const room_db = await this.getRoomByName(room.name); + const is_match = await bcrypt.compare(room.password, room_db.hash); + if (!is_match) + { + console.log(`throw error: code: 'BAD_PASSWORD', message: 'bad password'`); + throw new HttpException({ code: 'BAD_PASSWORD', message: `bad password` }, HttpStatus.UNAUTHORIZED); + } + + room_db.allowed_users.push(username); + await this.chatroomRepository.save(room_db); + + console.log("-- out setPasswordValidation service"); + } + /* ADDERS ************************************************* */ @@ -211,12 +229,17 @@ export class ChatService { if (find_room) { console.log("throw error: This room name already exist"); - throw new HttpException(`This room name already exist`, HttpStatus.CONFLICT); + throw new HttpException( `This room name already exist`, HttpStatus.CONFLICT); } let hash; if (room.protection) { + if (room.type === 'direct') + { + console.log("throw error: code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); + throw new HttpException({ code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room`}, HttpStatus.CONFLICT); + } const saltOrRounds = 10; const password = room.password; hash = await bcrypt.hash(password, saltOrRounds); @@ -226,11 +249,16 @@ export class ChatService { let newChatroom = new Chatroom(); newChatroom.name = room.name; newChatroom.type = room.type; - newChatroom.owner = room.owner; + newChatroom.owner = username; newChatroom.users = room.users; + newChatroom.allowed_users = []; if (room.protection) + { newChatroom.hash = hash; - newChatroom.messages = [ + newChatroom.allowed_users.push(username); + } + newChatroom.messages = + [ { name: "SERVER", message: `creation of room ${room.name}` }, { name: "SERVER", message: `${room.users[0]} joined the room` }, ]; @@ -284,8 +312,8 @@ export class ChatService { } if (room.type === "direct") { - console.log("throw error: you cannot leave a direct messages conversation"); - throw new HttpException(`you cannot leave a direct messages conversation`, HttpStatus.CONFLICT); + console.log("throw error: code: 'LEAVING_DIRECT_FORBIDDEN', message: 'you cannot leave a direct messages conversation'"); + throw new HttpException({ code: `LEAVING_DIRECT_FORBIDDEN`, message: `you cannot leave a direct messages conversation`, status: HttpStatus.CONFLICT }, HttpStatus.CONFLICT); } // delete user from room diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index c6e09176..fb32e7fe 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -37,6 +37,11 @@ export class roomDto @IsOptional() users?: string[]; // usernames + @IsArray() + @IsString({ each: true }) + @IsOptional() + allowed_users: string[]; // usernames + @IsArray() //@IsInstance(messagesDto, { each: true }) //@IsObject({ each: true }) diff --git a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts index 02a2bac6..ff59646f 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts @@ -36,8 +36,12 @@ export class Chatroom @Column("simple-array") @IsArray() @IsString({ each: true }) - @IsOptional() - users?: string[]; // usernames + users: string[]; // usernames + + @Column("simple-array") + @IsArray() + @IsString({ each: true }) + allowed_users: string[]; // usernames @Column("json") messages: messagesDto[]; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index f1f7de90..59e4aeb2 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -38,6 +38,8 @@ name: room_name, type: room_type, }; + if (is_protected === true) + room.password = room_password; // send the new room response = await create_room(room); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte index 0d2d10b1..c64334c9 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte @@ -16,7 +16,10 @@ console.log("room:", room); const updated_room = await join_room(room); console.log("updated room:", updated_room); - await change_room(updated_room); + if (room.protection) + layout.set("protected"); + else + await change_room(updated_room); } diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte index a07814b6..0551f91d 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte @@ -1,10 +1,35 @@ -
@@ -32,6 +57,17 @@ + +
+ {#if response.status >= 300} + + {/if} + + + + + +
diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index bd777b16..4a567579 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -76,7 +76,6 @@ export async function change_room(room: Room) { console.log("in change_room"); - console.log("room:", room); const response = await fetch('/api/v2/chat/change', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -112,7 +111,10 @@ export async function get_my_rooms() console.log("in get_my_rooms"); const response = await fetch('/api/v2/chat/myrooms'); + console.log("response.status", response.status); const data = await response.json(); + console.log("data:", data); + let rooms = data.rooms.map(room => set_client_name_on_room(room)); console.log("rooms:", rooms); From 8e4ce8e9a89a4a10d451c70205001a34b6491a9f Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 01:14:10 +0100 Subject: [PATCH 21/40] wip password protected --- .../api_back/src/chat/chat.controller.ts | 14 +++++++++---- .../nestjs/api_back/src/chat/chat.service.ts | 20 +++---------------- .../nestjs/api_back/src/chat/dto/room.dto.ts | 2 +- .../src/chat/entities/chatroom.entity.ts | 2 +- 4 files changed, 15 insertions(+), 23 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 4308c4cc..53551842 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -115,10 +115,16 @@ export class ChatController { throw new HttpException( `Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); } - if (!room.password || room.password.length === 0) + if (typeof room.protection === 'undefined') room.protection = false; - else - room.protection = true; + else if (room.protection === true) + { + if (!room.password || room.password.length === 0) + { + console.log(`throw error: code: 'PASSWORD_BAD_FORMAT', message: 'your password is too short'`); + throw new HttpException({ code: 'PASSWORD_BAD_FORMAT', message: `your password is too short` }, HttpStatus.UNPROCESSABLE_ENTITY); + } + } room.users = [req.user.username]; await this.chatService.addUserToNewRoom(req.user.username, room); @@ -191,7 +197,7 @@ export class ChatController { console.log("throw error: code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); throw new HttpException({ code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.BAD_REQUEST); } - if (!room_db.allowed_users.contains(req.user.username)) + if (!room_db.allowed_users.includes(req.user.username)) await this.chatService.setPasswordValidation(req.user.username, room); } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 18763305..8b3e30c3 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -45,7 +45,6 @@ export class ChatService { } const rooms = await queryBuilder.getMany(); - console.log("--- rooms:", rooms); console.log("-- out getMyRooms service"); return rooms; @@ -69,7 +68,6 @@ export class ChatService { const rooms = await this.chatroomRepository .createQueryBuilder('chatroom') .getMany(); - console.log("--- rooms:", rooms); console.log("-- out getAllRooms service"); return rooms; @@ -85,7 +83,6 @@ export class ChatService { .where('chatroom.type NOT IN (:...type)', { type: ['private', 'direct'] }) .andWhere('chatroom.users NOT LIKE :user_name', { user_name: `%${username}%` }) .getMany(); - console.log("--- rooms:", rooms); console.log("-- out getAllNotMyRooms service"); return rooms; @@ -95,11 +92,6 @@ export class ChatService { { console.log("-- in getAllOtherRoomsAndUsers service"); - const temp = await this.chatroomRepository - .createQueryBuilder('chatroom') - .getMany(); - console.log("all rooms:", temp); - const all_rooms = await this.getAllNotMyRooms(username); const all_users = await this.getAllUsersNotMyRooms(username); @@ -116,7 +108,6 @@ export class ChatService { }; }); let rooms: roomDto[] = row_rooms.concat(users); - console.log("--- rooms:", rooms); console.log("-- in getAllOtherRoomsAndUsers service"); return rooms; @@ -140,9 +131,7 @@ export class ChatService { { console.log("-- in getCurrentRoomName service"); - console.log("username:", username); const user_db = await this.getUserByName(username); - console.log("user_db:", user_db); console.log("-- out getCurrentRoomName service"); return user_db.currentRoom; @@ -152,7 +141,6 @@ export class ChatService { { console.log("-- in getRoomByName service"); - console.log("room_name:", room_name); const queryBuilder = this.chatroomRepository .createQueryBuilder('chatroom') .where('chatroom.name = :name', { name: room_name }); @@ -164,7 +152,6 @@ export class ChatService { } const room = await queryBuilder.getOne(); - console.log("room:", room); console.log("-- out getRoomByName service"); return room; @@ -235,6 +222,7 @@ export class ChatService { let hash; if (room.protection) { + console.log("in room protection hash"); if (room.type === 'direct') { console.log("throw error: code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); @@ -361,7 +349,6 @@ export class ChatService { .createQueryBuilder('user') .where('user.username NOT IN (:...usernames)', { usernames: usernames }) .getMany(); - console.log("--- users:", users); console.log("-- out getAllUsersNotMyRooms service"); return users; @@ -379,7 +366,6 @@ export class ChatService { .createQueryBuilder('user') .where('user.username NOT IN (:...usernames)', { usernames: usernames }) .getMany(); - console.log("--- users:", users); console.log("-- out getAllUsersNotInRoom service"); return users; @@ -413,7 +399,7 @@ export class ChatService { async socketJoinRoom(socket: socketDto, room_name: string): Promise { - console.log('- in socketJoinRoom service'); + console.log('-- in socketJoinRoom service'); socket.leave(socket.room); socket.join(room_name); @@ -422,7 +408,7 @@ export class ChatService { await socket.to(socket.room).emit('message', "SERVER", message); await this.addMessageToRoom(room_name, "SERVER", message); - console.log('- out socketJoinRoom service'); + console.log('-- out socketJoinRoom service'); } } diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index fb32e7fe..c4dfba54 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -40,7 +40,7 @@ export class roomDto @IsArray() @IsString({ each: true }) @IsOptional() - allowed_users: string[]; // usernames + allowed_users?: string[]; // usernames @IsArray() //@IsInstance(messagesDto, { each: true }) diff --git a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts index ff59646f..ece8702e 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/entities/chatroom.entity.ts @@ -25,7 +25,7 @@ export class Chatroom @IsBoolean() protection: boolean = false; - @Column() + @Column({ nullable: true }) @IsString() @IsOptional() hash?: string; From 356e1caac364e6c639d41b70d5ed52f78b66b6fe Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 13:07:18 +0100 Subject: [PATCH 22/40] wip protected, already solved error http handling for createroom --- .../api_back/src/chat/chat.controller.ts | 54 +++++++++--- .../nestjs/api_back/src/chat/chat.service.ts | 20 ++--- .../src/pieces/chat/Interface_chat.ts | 11 +++ .../src/pieces/chat/Layout_create.svelte | 11 +-- .../src/pieces/chat/Layout_protected.svelte | 18 ++-- .../src/pieces/chat/Request_rooms.ts | 85 ++++++++++++------- .../src/pieces/chat/Request_utils.ts | 29 +++++++ 7 files changed, 163 insertions(+), 65 deletions(-) create mode 100644 srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 53551842..975276ff 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -111,8 +111,8 @@ export class ChatController { if (test_regex.test(room.name) === false) { let forbidden_chars = room.name.replace(new RegExp(regex_base, "g"), ""); - console.log(`throw error: Your room name can not contains these characters : ${forbidden_chars}`); - throw new HttpException( `Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY); + console.log(`throw error: display: true, code: 'FORBIDDEN_CHARACTERS', message: 'Your room name can not contains these characters : ${forbidden_chars}'`); + throw new HttpException({ display: true, code: 'FORBIDDEN_CHARACTERS', message: `Your room name can not contains these characters : ${forbidden_chars}` }, HttpStatus.OK); } if (typeof room.protection === 'undefined') @@ -121,8 +121,8 @@ export class ChatController { { if (!room.password || room.password.length === 0) { - console.log(`throw error: code: 'PASSWORD_BAD_FORMAT', message: 'your password is too short'`); - throw new HttpException({ code: 'PASSWORD_BAD_FORMAT', message: `your password is too short` }, HttpStatus.UNPROCESSABLE_ENTITY); + console.log(`throw error: display: true, code: 'PASSWORD_TOO_SHORT', message: 'your password is too short'`); + throw new HttpException({ display: true, code: 'PASSWORD_TOO_SHORT', message: `your password is too short` }, HttpStatus.OK); } } room.users = [req.user.username]; @@ -156,18 +156,18 @@ export class ChatController { const room_db = await this.chatService.getRoomByName(room.name, fields); if (room_db.type === 'direct') { - console.log("throw error: cannot join a direct messages room"); - throw new HttpException( `cannot join a direct messages room`, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'JOIN_DIRECT_FORBIDDEN', message: 'cannot join a direct messages room'"); + throw new HttpException({ display: true, code: 'JOIN_DIRECT_FORBIDDEN', message: `cannot join a direct messages room` }, HttpStatus.OK); } if (room_db.type === 'private') { - console.log("throw error: cannot join a private room"); - throw new HttpException( `cannot join a private room`, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: 'cannot join a private room'"); + throw new HttpException({ display: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: `cannot join a private room` }, HttpStatus.OK); } if (room_db.users.includes(req.user.username)) { - console.log("throw error: your have already joined this room"); - throw new HttpException( `your have already joined this room`, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'ALREADY_JOIN', message: 'your have already joined this room'"); + throw new HttpException({ display: true, code: 'ALREADY_JOIN', message: `your have already joined this room` }, HttpStatus.OK); } room = await this.chatService.addUserToRoom(req.user.username, room.name); } @@ -188,14 +188,42 @@ export class ChatController { { console.log("- in changeRoom controller"); + let fields = ["protection", "allowed_users"]; + const room_db = await this.chatService.getRoomByName(room.name, fields); + if (room_db.protection === true) + { + if (!room_db.allowed_users.includes(req.user.username)) + { + console.log("throw error: display: true, code: 'NEED_AUTHENTICATE', message: 'You didn't provide the password for this room'"); + throw new HttpException({ display: true, code: 'NEED_AUTHENTICATE', message: `You didn't provide the password for this room` }, HttpStatus.OK); + } + } + + await this.chatService.setCurrentRoom(req.user.username, room.name); + let socket: socketDto = this.chatGateway.sockets.get(req.user.username); + await this.chatService.socketChangeRoom(socket, room.name); + + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); + + console.log("- out changeRoom controller"); + } + + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Post('password') + async setPassword(@Body() room: roomDto, @Req() req, @Res() res): Promise + { + console.log("- in setPassword controller"); + let fields = ["protection", "allowed_users"]; const room_db = await this.chatService.getRoomByName(room.name, fields); if (room_db.protection === true) { if (!room.password) { - console.log("throw error: code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); - throw new HttpException({ code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.BAD_REQUEST); + console.log("throw error: display: true, code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); + throw new HttpException({ display: true, code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.OK); } if (!room_db.allowed_users.includes(req.user.username)) await this.chatService.setPasswordValidation(req.user.username, room); @@ -208,7 +236,7 @@ export class ChatController { const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); - console.log("- out changeRoom controller"); + console.log("- out setPassword controller"); } @UseGuards(AuthenticateGuard) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 8b3e30c3..b0618d62 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -194,8 +194,8 @@ export class ChatService { const is_match = await bcrypt.compare(room.password, room_db.hash); if (!is_match) { - console.log(`throw error: code: 'BAD_PASSWORD', message: 'bad password'`); - throw new HttpException({ code: 'BAD_PASSWORD', message: `bad password` }, HttpStatus.UNAUTHORIZED); + console.log(`throw error: display: true, code: 'BAD_PASSWORD', message: 'bad password'`); + throw new HttpException({ display: true, code: 'BAD_PASSWORD', message: `bad password` }, HttpStatus.OK); } room_db.allowed_users.push(username); @@ -215,8 +215,8 @@ export class ChatService { const find_room = await this.getRoomByName(room.name); if (find_room) { - console.log("throw error: This room name already exist"); - throw new HttpException( `This room name already exist`, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'ROOM_CONFLICT', message: 'This room name already exist'"); + throw new HttpException({ display: true, code: 'ROOM_CONFLICT', message: `This room name already exist` }, HttpStatus.OK); } let hash; @@ -225,8 +225,8 @@ export class ChatService { console.log("in room protection hash"); if (room.type === 'direct') { - console.log("throw error: code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); - throw new HttpException({ code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room`}, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); + throw new HttpException({ display: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room`}, HttpStatus.OK); } const saltOrRounds = 10; const password = room.password; @@ -295,13 +295,13 @@ export class ChatService { const room = await this.getRoomByName(room_name); if (!room.users.includes(username)) { - console.log("throw error: your are not in this room"); - throw new HttpException(`your are not in this room`, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'USER_NOT_FOUND', message: 'your are not in this room'"); + throw new HttpException({ display: true, code: 'USER_NOT_FOUND', message: `your are not in this room` }, HttpStatus.OK); } if (room.type === "direct") { - console.log("throw error: code: 'LEAVING_DIRECT_FORBIDDEN', message: 'you cannot leave a direct messages conversation'"); - throw new HttpException({ code: `LEAVING_DIRECT_FORBIDDEN`, message: `you cannot leave a direct messages conversation`, status: HttpStatus.CONFLICT }, HttpStatus.CONFLICT); + console.log("throw error: display: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: 'you cannot leave a direct messages conversation'"); + throw new HttpException({ display: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: `you cannot leave a direct messages conversation` }, HttpStatus.OK); } // delete user from room diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts index ca9b761c..e634f732 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts @@ -3,4 +3,15 @@ export interface Room name: string; type: "public" | "protected" | "private" | "direct" | "user"; users?: string[]; + client_name?: string; + protection?: boolean; +} + +export interface FetchResponse +{ + status: number; + code?: string; + display?: boolean; + message?: string; + room?: any; } diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index 59e4aeb2..b6f59530 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -3,6 +3,7 @@ import { msgs, layout, allowed_chars } from './Store_chat'; import { change_room, create_room } from './Request_rooms'; import { onMount } from 'svelte'; + import type { FetchResponse } from './Interface_chat'; import Button from './Element_button.svelte'; import Warning from './Element_warning.svelte'; @@ -22,10 +23,8 @@ let room_type: string; let is_protected = false; let room_password: string; - let response = { - status: 0, - message: "", - } + let response: FetchResponse; + let show_error = false; async function handleSubmit(evt) { @@ -37,12 +36,14 @@ let room = { name: room_name, type: room_type, + protection: is_protected, }; if (is_protected === true) room.password = room_password; // send the new room response = await create_room(room); + show_error = response.display; // go to room if (response.status === 200) await change_room(response.room); @@ -70,7 +71,7 @@
- {#if response.status >= 300} + {#if show_error} {/if} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte index 0551f91d..284464e5 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte @@ -1,17 +1,16 @@ @@ -59,7 +63,7 @@
- {#if response.status >= 300} + {#if show_error} {/if} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index 4a567579..02ffaafc 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -1,5 +1,6 @@ import { msgs, user, layout, socket, current_room_name, current_room_type } from './Store_chat'; -import type { Room } from './Interface_chat'; +import type { Room, FetchResponse } from './Interface_chat'; +import { set_client_name_on_room, fill_fetch_response } from './Request_utils'; export async function get_room_messages() { @@ -24,23 +25,31 @@ export async function create_room(room: Room) { console.log("in create_room"); + let response: FetchResponse = { status: 0 }; + // send the new room - const response = await fetch('/api/v2/chat/create', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(room), - }); + try { + const resp = await fetch('/api/v2/chat/create', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(room), + }); + console.log("resp.status:"); + console.log(resp.status); + response.status = resp.status; + if (!resp.ok) + throw new Error(resp.statusText); - // get response status and message - let response_status = response.status; - let data = await response.json(); - let response_message = ""; + // get response message + let data = await resp.json(); + fill_fetch_response(response, data); + } + catch (error) + { + console.error('Error', error); + } - return { - status: response_status, - message: data.message, - room: data.room, - }; + return response; } export async function join_room(room: Room) @@ -57,21 +66,6 @@ export async function join_room(room: Room) return data.room; } -function set_client_name_on_room(room: Room) -{ - console.log("in set_client_name_on_room, for room:", room); - if (room.type === 'direct') - { - console.log("in direct room"); - room.client_name = room.users[0]; - if (room.client_name === user.username) - room.client_name = room.users[1]; - } - else - room.client_name = room.name; - return room; -} - export async function change_room(room: Room) { console.log("in change_room"); @@ -92,6 +86,37 @@ export async function change_room(room: Room) layout.set("room"); } +export async function send_password(room: Room) +{ + console.log("in create_room"); + + let response: FetchResponse = { status: 0 }; + + // send the new room + try { + const resp = await fetch('/api/v2/chat/create', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(room), + }); + console.log("resp.status:"); + console.log(resp.status); + response.status = resp.status; + if (!resp.ok) + throw new Error(resp.statusText); + + // get response message + let data = await resp.json(); + fill_fetch_response(response, data); + } + catch (error) + { + console.error('Error', error); + } + + return response; +} + export async function invite_user(user_name: string) { console.log("in invite_user"); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts new file mode 100644 index 00000000..d0378af5 --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts @@ -0,0 +1,29 @@ +import { user } from './Store_chat'; +import type { Room, FetchResponse } from './Interface_chat'; + +export function set_client_name_on_room(room: Room) +{ + console.log("in set_client_name_on_room, for room:", room); + if (room.type === 'direct') + { + console.log("in direct room"); + room.client_name = room.users[0]; + if (room.client_name === user.username) + room.client_name = room.users[1]; + } + else + room.client_name = room.name; + return room; +} + +export function fill_fetch_response(response: FetchResponse, data: any) +{ + if (data.display) + response.display = data.display; + if (data.code) + response.code = data.code; + if (data.message) + response.message = data.message; + if (data.room) + response.room = data.room; +} From d07b13b749349f884001fede981bf7c029f8efae Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 14:23:02 +0100 Subject: [PATCH 23/40] exported function fetch with catch --- .../api_back/src/chat/chat.controller.ts | 7 -- .../src/pieces/chat/Layout_create.svelte | 2 +- .../src/pieces/chat/Layout_protected.svelte | 2 +- .../src/pieces/chat/Request_rooms.ts | 115 ++++-------------- .../src/pieces/chat/Request_utils.ts | 30 ++++- .../chat/{Interface_chat.ts => Types_chat.ts} | 17 ++- 6 files changed, 70 insertions(+), 103 deletions(-) rename srcs/requirements/svelte/api_front/src/pieces/chat/{Interface_chat.ts => Types_chat.ts} (61%) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 975276ff..39740dc3 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -229,13 +229,6 @@ export class ChatController { await this.chatService.setPasswordValidation(req.user.username, room); } - await this.chatService.setCurrentRoom(req.user.username, room.name); - let socket: socketDto = this.chatGateway.sockets.get(req.user.username); - await this.chatService.socketChangeRoom(socket, room.name); - - const ret_room = this.format_room(room); - res.status(HttpStatus.OK).json({ room: ret_room }); - console.log("- out setPassword controller"); } diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index b6f59530..e889aab2 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -3,7 +3,7 @@ import { msgs, layout, allowed_chars } from './Store_chat'; import { change_room, create_room } from './Request_rooms'; import { onMount } from 'svelte'; - import type { FetchResponse } from './Interface_chat'; + import type { FetchResponse } from './Types_chat'; import Button from './Element_button.svelte'; import Warning from './Element_warning.svelte'; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte index 284464e5..9c336b5b 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte @@ -2,7 +2,7 @@ import { layout, current_room_name, current_room_type } from './Store_chat'; import { change_room, send_password } from './Request_rooms'; - import type { FetchResponse } from './Interface_chat'; + import type { FetchResponse } from './Types_chat'; import Button from './Element_button.svelte'; import Warning from './Element_warning.svelte'; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index 02ffaafc..8a9eb5cc 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -1,13 +1,14 @@ import { msgs, user, layout, socket, current_room_name, current_room_type } from './Store_chat'; -import type { Room, FetchResponse } from './Interface_chat'; -import { set_client_name_on_room, fill_fetch_response } from './Request_utils'; +import type { Room, FetchMethod, FetchResponse } from './Types_chat'; +import { fetch_request, set_client_name_on_room, fill_fetch_response } from './Request_utils'; export async function get_room_messages() { console.log("in get_room_messages"); - const response = await fetch('/api/v2/chat/messages'); - const data = await response.json(); - const messages = data.messages; + + let response: FetchResponse = await fetch_request('messages', FetchMethod.GET); + + const messages = response.messages; if (messages === null) return; @@ -25,29 +26,7 @@ export async function create_room(room: Room) { console.log("in create_room"); - let response: FetchResponse = { status: 0 }; - - // send the new room - try { - const resp = await fetch('/api/v2/chat/create', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(room), - }); - console.log("resp.status:"); - console.log(resp.status); - response.status = resp.status; - if (!resp.ok) - throw new Error(resp.statusText); - - // get response message - let data = await resp.json(); - fill_fetch_response(response, data); - } - catch (error) - { - console.error('Error', error); - } + let response: FetchResponse = await fetch_request('create', FetchMethod.POST, room); return response; } @@ -56,26 +35,16 @@ export async function join_room(room: Room) { console.log("in join_room"); - const response = await fetch('/api/v2/chat/join', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(room), - }); - let data = await response.json(); + let response: FetchResponse = await fetch_request('join', FetchMethod.POST, room); - return data.room; + return response.room; } export async function change_room(room: Room) { console.log("in change_room"); - const response = await fetch('/api/v2/chat/change', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(room), - }); - let data = await response.json(); + await fetch_request('change', FetchMethod.POST, room); await get_room_messages(); @@ -86,33 +55,12 @@ export async function change_room(room: Room) layout.set("room"); } + export async function send_password(room: Room) { - console.log("in create_room"); + console.log("in send_password"); - let response: FetchResponse = { status: 0 }; - - // send the new room - try { - const resp = await fetch('/api/v2/chat/create', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(room), - }); - console.log("resp.status:"); - console.log(resp.status); - response.status = resp.status; - if (!resp.ok) - throw new Error(resp.statusText); - - // get response message - let data = await resp.json(); - fill_fetch_response(response, data); - } - catch (error) - { - console.error('Error', error); - } + let response: FetchResponse = await fetch_request('password', FetchMethod.POST, room); return response; } @@ -121,12 +69,7 @@ export async function invite_user(user_name: string) { console.log("in invite_user"); - const response = await fetch('/api/v2/chat/invite', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({username: user_name}), - }); - let data = await response.json(); + let response: FetchResponse = await fetch_request('invite', FetchMethod.POST, {username: user_name}); await get_room_messages(); } @@ -135,13 +78,9 @@ export async function get_my_rooms() { console.log("in get_my_rooms"); - const response = await fetch('/api/v2/chat/myrooms'); - console.log("response.status", response.status); - const data = await response.json(); - console.log("data:", data); + let response: FetchResponse = await fetch_request('myrooms', FetchMethod.GET); - let rooms = data.rooms.map(room => set_client_name_on_room(room)); - console.log("rooms:", rooms); + let rooms = response.rooms.map(room => set_client_name_on_room(room)); return rooms; } @@ -150,41 +89,33 @@ export async function get_all_rooms() { console.log("in get_all_rooms"); - const response = await fetch('/api/v2/chat/allrooms'); - const data = await response.json(); + let response: FetchResponse = await fetch_chat_request('allrooms', FetchMethod.GET); - return data.rooms; + return response.rooms; } export async function get_room_users() { console.log("in get_room_users"); - const response = await fetch('/api/v2/chat/roomusers'); - const data = await response.json(); - console.log("users:", data.users); + let response: FetchResponse = await fetch_chat_request('roomusers', FetchMethod.GET); - return data.users; + return response.users; } export async function get_all_users() { console.log("in get_all_users"); - const response = await fetch('/api/v2/chat/users'); - const data = await response.json(); - console.log("users:", data.users); + let response: FetchResponse = await fetch_chat_request('users', FetchMethod.GET); - return data.users; + return response.users; } export async function leave_room() { console.log("in leave_room"); - const response = await fetch('/api/v2/chat/leave', { - method: 'DELETE', - }); + let response: FetchResponse = await fetch_chat_request('leave', FetchMethod.DELETE); } - diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts index d0378af5..729aa799 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts @@ -1,5 +1,33 @@ import { user } from './Store_chat'; -import type { Room, FetchResponse } from './Interface_chat'; +import type { Room, FetchResponse, FetchInit, FetchMethod } from './Types_chat'; + +export async function fetch_request(route: string, fetchMethod: FetchMethod, param?: any) +{ + let response: FetchResponse = { status: 0 }; + + let fetch_params: FetchInit = { + method: fetchMethod, + headers: { 'Content-Type': 'application/json' }, + } + if (param) + fetch_params.body = JSON.stringify(param); + + try { + const resp = await fetch(`/api/v2/chat/${route}`, fetch_params); + response.status = resp.status; + if (!resp.ok) + throw new Error(resp.statusText); + + let data = await resp.json(); + fill_fetch_response(response, data); + } + catch (error) + { + console.error('Error', error); + } + + return response; +} export function set_client_name_on_room(room: Room) { diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts similarity index 61% rename from srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts rename to srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts index e634f732..f1a332cc 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Interface_chat.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts @@ -13,5 +13,20 @@ export interface FetchResponse code?: string; display?: boolean; message?: string; - room?: any; + room?: Room; } + +export interface FetchInit +{ + method: string; + headers: any; + body?: string; +} + +export enum FetchMethod +{ + POST = 'POST', + GET = 'GET', + LEAVE = 'LEAVE', +} + From 044926239883d6ef82abaa7abe815195515b3834 Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 15:27:57 +0100 Subject: [PATCH 24/40] fetch error consolidate --- .../src/pieces/chat/Layout_create.svelte | 2 +- .../src/pieces/chat/Layout_protected.svelte | 2 +- .../src/pieces/chat/Request_rooms.ts | 18 ++++++++--------- .../src/pieces/chat/Request_utils.ts | 20 +++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index e889aab2..fd976639 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -3,7 +3,7 @@ import { msgs, layout, allowed_chars } from './Store_chat'; import { change_room, create_room } from './Request_rooms'; import { onMount } from 'svelte'; - import type { FetchResponse } from './Types_chat'; + import { FetchResponse } from './Types_chat'; import Button from './Element_button.svelte'; import Warning from './Element_warning.svelte'; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte index 9c336b5b..45a9c11b 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_protected.svelte @@ -2,7 +2,7 @@ import { layout, current_room_name, current_room_type } from './Store_chat'; import { change_room, send_password } from './Request_rooms'; - import type { FetchResponse } from './Types_chat'; + import { FetchResponse } from './Types_chat'; import Button from './Element_button.svelte'; import Warning from './Element_warning.svelte'; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts index 8a9eb5cc..b7e763a6 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_rooms.ts @@ -1,12 +1,12 @@ import { msgs, user, layout, socket, current_room_name, current_room_type } from './Store_chat'; -import type { Room, FetchMethod, FetchResponse } from './Types_chat'; -import { fetch_request, set_client_name_on_room, fill_fetch_response } from './Request_utils'; +import { Room, FetchResponse, FetchMethod } from './Types_chat'; +import { fetch_chat_request, set_client_name_on_room, fill_fetch_response } from './Request_utils'; export async function get_room_messages() { console.log("in get_room_messages"); - let response: FetchResponse = await fetch_request('messages', FetchMethod.GET); + let response: FetchResponse = await fetch_chat_request('messages', FetchMethod.GET); const messages = response.messages; @@ -26,7 +26,7 @@ export async function create_room(room: Room) { console.log("in create_room"); - let response: FetchResponse = await fetch_request('create', FetchMethod.POST, room); + let response: FetchResponse = await fetch_chat_request('create', FetchMethod.POST, room); return response; } @@ -35,7 +35,7 @@ export async function join_room(room: Room) { console.log("in join_room"); - let response: FetchResponse = await fetch_request('join', FetchMethod.POST, room); + let response: FetchResponse = await fetch_chat_request('join', FetchMethod.POST, room); return response.room; } @@ -44,7 +44,7 @@ export async function change_room(room: Room) { console.log("in change_room"); - await fetch_request('change', FetchMethod.POST, room); + await fetch_chat_request('change', FetchMethod.POST, room); await get_room_messages(); @@ -60,7 +60,7 @@ export async function send_password(room: Room) { console.log("in send_password"); - let response: FetchResponse = await fetch_request('password', FetchMethod.POST, room); + let response: FetchResponse = await fetch_chat_request('password', FetchMethod.POST, room); return response; } @@ -69,7 +69,7 @@ export async function invite_user(user_name: string) { console.log("in invite_user"); - let response: FetchResponse = await fetch_request('invite', FetchMethod.POST, {username: user_name}); + let response: FetchResponse = await fetch_chat_request('invite', FetchMethod.POST, {username: user_name}); await get_room_messages(); } @@ -78,7 +78,7 @@ export async function get_my_rooms() { console.log("in get_my_rooms"); - let response: FetchResponse = await fetch_request('myrooms', FetchMethod.GET); + let response: FetchResponse = await fetch_chat_request('myrooms', FetchMethod.GET); let rooms = response.rooms.map(room => set_client_name_on_room(room)); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts index 729aa799..6c188834 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Request_utils.ts @@ -1,7 +1,7 @@ import { user } from './Store_chat'; -import type { Room, FetchResponse, FetchInit, FetchMethod } from './Types_chat'; +import { Room, FetchResponse, FetchInit, FetchMethod } from './Types_chat'; -export async function fetch_request(route: string, fetchMethod: FetchMethod, param?: any) +export async function fetch_chat_request(route: string, fetchMethod: FetchMethod, param?: any) { let response: FetchResponse = { status: 0 }; @@ -26,6 +26,7 @@ export async function fetch_request(route: string, fetchMethod: FetchMethod, par console.error('Error', error); } + console.log("response:", response); return response; } @@ -46,12 +47,11 @@ export function set_client_name_on_room(room: Room) export function fill_fetch_response(response: FetchResponse, data: any) { - if (data.display) - response.display = data.display; - if (data.code) - response.code = data.code; - if (data.message) - response.message = data.message; - if (data.room) - response.room = data.room; + console.log("data:", data); + Object.keys(data).forEach(key => + { + console.log(key) + response[key] = data[key]; + }); + console.log(response); } From 52f48ae30568f461ab74e33fc64d15881bfaa56b Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sat, 14 Jan 2023 18:34:03 +0100 Subject: [PATCH 25/40] bugfix generateToken() for invitation --- .../nestjs/api_back/src/game/game.service.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 2e52357e..d6ca27c5 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -94,9 +94,15 @@ export class GameService { } if (grantTicketDto.isGameIsWithInvitation === true) { - const secondUser : Partial = await this.userService.findOne(grantTicketDto.playerTwoUsername) - if (!secondUser || secondUser.username === user.username) - return res.status(HttpStatus.NOT_FOUND).json({message : "User not found OR you want to play with yourself."}); + if (grantTicketDto.playerTwoUsername === user.username) { + return res.status(HttpStatus.BAD_REQUEST).json({message : "You cant play against yourself."}); + } + const secondUser : User = await this.userRepository.createQueryBuilder('user') + .where("user.username = :username", {username : grantTicketDto.playerTwoUsername}) + .getOne(); + if (!secondUser) { + return res.status(HttpStatus.NOT_FOUND).json({message : "Invited user not found"}); + } const encryptedTextToReturn = await this.encryptToken(user.username + '_' + secondUser.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) const tok = this.tokenGameRepository.create(grantTicketDto); @@ -108,7 +114,6 @@ export class GameService { this.userService.updateStatus(secondUser.id, STATUS.IN_POOL) return res.status(HttpStatus.OK).json({ token : encryptedTextToReturn }); } - // else if (grantTicketDto.isGameIsWithInvitation === false && user.status !== STATUS.IN_GAME) { // WIP: need to fix STATUS.IN_GAME else if (grantTicketDto.isGameIsWithInvitation === false) { const encryptedTextToReturn = await this.encryptToken(user.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) @@ -285,9 +290,9 @@ export class GameService { const playerTwo = await this.userRepository.findOneBy({username : game.playerTwoUsername}) if (!playerOne || !playerTwo) return new HttpException("Internal Server Error. Impossible to update the database", HttpStatus.INTERNAL_SERVER_ERROR); - this.userService.updateStatus(playerOne.id, STATUS.CONNECTED) - this.userService.updateStatus(playerTwo.id, STATUS.CONNECTED) - if (game.playerOneUsernameResult === game.playerTwoUsernameResult) + this.userService.updateStatus(playerOne.id, STATUS.CONNECTED); + this.userService.updateStatus(playerTwo.id, STATUS.CONNECTED); + if (game.playerOneUsernameResult === game.playerTwoUsernameResult) { this.userService.incrementDraws(playerOne.id) this.userService.incrementDraws(playerTwo.id) From efc836eac059b8fa8e467b95ca82aae0b632be9b Mon Sep 17 00:00:00 2001 From: simplonco Date: Sat, 14 Jan 2023 18:40:18 +0100 Subject: [PATCH 26/40] wip password, and better catch error http request --- .../api_back/src/chat/chat.controller.ts | 99 +++++++--------- .../nestjs/api_back/src/chat/chat.service.ts | 112 +++++++++--------- .../nestjs/api_back/src/chat/dev/dev_utils.ts | 13 ++ .../nestjs/api_back/src/chat/dto/room.dto.ts | 3 +- .../src/pieces/chat/Chat_layouts.svelte | 6 +- .../src/pieces/chat/Layout_create.svelte | 7 +- .../src/pieces/chat/Layout_home.svelte | 15 ++- .../src/pieces/chat/Layout_invite.svelte | 4 +- .../src/pieces/chat/Layout_new.svelte | 9 +- .../src/pieces/chat/Layout_protected.svelte | 23 ++-- .../src/pieces/chat/Layout_room.svelte | 4 +- .../src/pieces/chat/Layout_room_set.svelte | 6 +- .../src/pieces/chat/Request_rooms.ts | 15 ++- .../src/pieces/chat/Request_utils.ts | 22 ++-- .../api_front/src/pieces/chat/Store_chat.ts | 8 +- .../api_front/src/pieces/chat/Types_chat.ts | 6 +- 16 files changed, 185 insertions(+), 167 deletions(-) create mode 100644 srcs/requirements/nestjs/api_back/src/chat/dev/dev_utils.ts diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 39740dc3..59d700d5 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -9,6 +9,7 @@ import { setCurrentRoomDto } from './dto/setCurrentRoom.dto'; import { ChatGateway } from './chat.gateway'; import { socketDto } from './dto/socket.dto'; import { Chatroom } from './entities/chatroom.entity'; +import { printCaller } from './dev/dev_utils'; @Controller('chat') export class ChatController { @@ -23,13 +24,12 @@ export class ChatController { let new_room: roomDto = { name: room.name, type: room.type, + protection: room.protection, }; if (room.owner) new_room.owner = room.owner; if (room.users) new_room.users = room.users; - if (room.protection) - new_room.protection = room.protection; return new_room; } @@ -46,15 +46,14 @@ export class ChatController { @Get('myrooms') async getMyRooms(@Req() req, @Res() res): Promise { - console.log("- in getMyRooms controller"); + printCaller("- in "); - let fields = ["name", "type", "users"]; + let fields = ["name", "type", "users", "protection"]; const rooms = await this.chatService.getMyRooms(req.user.username, fields); const ret_rooms = rooms.map(room => this.format_room(room)); res.status(HttpStatus.OK).json({ rooms: ret_rooms }); - - console.log("- out getMyRooms controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -62,14 +61,13 @@ export class ChatController { @Get('allrooms') async getAllRooms(@Req() req, @Res() res): Promise { - console.log("- in getAllRooms controller"); + printCaller("- in "); const rooms: roomDto[] = await this.chatService.getAllOtherRoomsAndUsers(req.user.username) const ret_rooms = rooms.map(room => this.format_room(room)); res.status(HttpStatus.OK).json({ rooms: ret_rooms }); - - console.log("- out getAllRooms controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -77,12 +75,11 @@ export class ChatController { @Get('current') async setCurrentRoom(@Body() setCurrentRoomDto: setCurrentRoomDto, @Req() req, @Res() res): Promise { - console.log("- in setCurrentRoom controller"); + printCaller("- in "); const response = await this.chatService.setCurrentRoom(req.user.username, setCurrentRoomDto.name); res.status(HttpStatus.OK).json({ message: response }); - - console.log("- out setCurrentRoom controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -90,11 +87,10 @@ export class ChatController { @Get('allowedchars') async allowedChars(@Res() res): Promise { - console.log("- in allowedChars controller"); + printCaller("- in "); res.status(HttpStatus.OK).json({ chars: this.allowed_chars }); - - console.log("- out allowedChars controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -102,7 +98,7 @@ export class ChatController { @Post('create') async createRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise { - console.log("- in createRoom controller"); + printCaller("- in "); // check chars in room name let chars = this.escape_chars(this.allowed_chars); @@ -111,8 +107,8 @@ export class ChatController { if (test_regex.test(room.name) === false) { let forbidden_chars = room.name.replace(new RegExp(regex_base, "g"), ""); - console.log(`throw error: display: true, code: 'FORBIDDEN_CHARACTERS', message: 'Your room name can not contains these characters : ${forbidden_chars}'`); - throw new HttpException({ display: true, code: 'FORBIDDEN_CHARACTERS', message: `Your room name can not contains these characters : ${forbidden_chars}` }, HttpStatus.OK); + console.log(`throw error: error: true, code: 'FORBIDDEN_CHARACTERS', message: 'Your room name can not contains these characters : ${forbidden_chars}'`); + throw new HttpException({ error: true, code: 'FORBIDDEN_CHARACTERS', message: `Your room name can not contains these characters : ${forbidden_chars}` }, HttpStatus.OK); } if (typeof room.protection === 'undefined') @@ -121,8 +117,8 @@ export class ChatController { { if (!room.password || room.password.length === 0) { - console.log(`throw error: display: true, code: 'PASSWORD_TOO_SHORT', message: 'your password is too short'`); - throw new HttpException({ display: true, code: 'PASSWORD_TOO_SHORT', message: `your password is too short` }, HttpStatus.OK); + console.log(`throw error: error: true, code: 'PASSWORD_TOO_SHORT', message: 'your password is too short'`); + throw new HttpException({ error: true, code: 'PASSWORD_TOO_SHORT', message: `your password is too short` }, HttpStatus.OK); } } room.users = [req.user.username]; @@ -130,8 +126,7 @@ export class ChatController { const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); - - console.log("- out createRoom controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -139,7 +134,7 @@ export class ChatController { @Post('join') async joinRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise { - console.log("- in joinRoom controller"); + printCaller("- in "); let response = ""; if (room.type === 'user') @@ -156,18 +151,18 @@ export class ChatController { const room_db = await this.chatService.getRoomByName(room.name, fields); if (room_db.type === 'direct') { - console.log("throw error: display: true, code: 'JOIN_DIRECT_FORBIDDEN', message: 'cannot join a direct messages room'"); - throw new HttpException({ display: true, code: 'JOIN_DIRECT_FORBIDDEN', message: `cannot join a direct messages room` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'JOIN_DIRECT_FORBIDDEN', message: 'cannot join a direct messages room'"); + throw new HttpException({ error: true, code: 'JOIN_DIRECT_FORBIDDEN', message: `cannot join a direct messages room` }, HttpStatus.OK); } if (room_db.type === 'private') { - console.log("throw error: display: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: 'cannot join a private room'"); - throw new HttpException({ display: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: `cannot join a private room` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: 'cannot join a private room'"); + throw new HttpException({ error: true, code: 'JOIN_PRIVATE_FORBIDDEN', message: `cannot join a private room` }, HttpStatus.OK); } if (room_db.users.includes(req.user.username)) { - console.log("throw error: display: true, code: 'ALREADY_JOIN', message: 'your have already joined this room'"); - throw new HttpException({ display: true, code: 'ALREADY_JOIN', message: `your have already joined this room` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'ALREADY_JOIN', message: 'your have already joined this room'"); + throw new HttpException({ error: true, code: 'ALREADY_JOIN', message: `your have already joined this room` }, HttpStatus.OK); } room = await this.chatService.addUserToRoom(req.user.username, room.name); } @@ -177,8 +172,7 @@ export class ChatController { const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); - - console.log("- out joinRoom controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -186,7 +180,7 @@ export class ChatController { @Post('change') async changeRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise { - console.log("- in changeRoom controller"); + printCaller("- in "); let fields = ["protection", "allowed_users"]; const room_db = await this.chatService.getRoomByName(room.name, fields); @@ -194,8 +188,8 @@ export class ChatController { { if (!room_db.allowed_users.includes(req.user.username)) { - console.log("throw error: display: true, code: 'NEED_AUTHENTICATE', message: 'You didn't provide the password for this room'"); - throw new HttpException({ display: true, code: 'NEED_AUTHENTICATE', message: `You didn't provide the password for this room` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'NEED_AUTHENTICATE', message: 'You didn't provide the password for this room'"); + throw new HttpException({ error: true, code: 'NEED_AUTHENTICATE', message: `You didn't provide the password for this room` }, HttpStatus.OK); } } @@ -205,8 +199,7 @@ export class ChatController { const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); - - console.log("- out changeRoom controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -214,7 +207,7 @@ export class ChatController { @Post('password') async setPassword(@Body() room: roomDto, @Req() req, @Res() res): Promise { - console.log("- in setPassword controller"); + printCaller("- in "); let fields = ["protection", "allowed_users"]; const room_db = await this.chatService.getRoomByName(room.name, fields); @@ -222,14 +215,13 @@ export class ChatController { { if (!room.password) { - console.log("throw error: display: true, code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); - throw new HttpException({ display: true, code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'PASSWORD_MISSING', message: 'this room is protected, you need to provide a password'"); + throw new HttpException({ error: true, code: 'PASSWORD_MISSING', message: `this room is protected, you need to provide a password` }, HttpStatus.OK); } if (!room_db.allowed_users.includes(req.user.username)) await this.chatService.setPasswordValidation(req.user.username, room); } - - console.log("- out setPassword controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -237,7 +229,7 @@ export class ChatController { @Post('invite') async inviteUser(@Body('username') username: string, @Req() req, @Res() res): Promise { - console.log("- in inviteUser controller"); + printCaller("- in "); let current_room_name = await this.chatService.getCurrentRoomName(req.user.username); let room = await this.chatService.addUserToRoom(username, current_room_name); @@ -246,8 +238,7 @@ export class ChatController { const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); - - console.log("- out inviteUser controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -255,7 +246,7 @@ export class ChatController { @Delete('leave') async leaveRoom(@Req() req, @Res() res): Promise { - console.log("- in leaveRoom controller"); + printCaller("- in "); const room_name = await this.chatService.getCurrentRoomName(req.user.username); let response = await this.chatService.removeUserFromRoom(req.user.username, room_name); @@ -271,8 +262,7 @@ export class ChatController { await socket.leave(socket.room); res.status(HttpStatus.OK).json({ message: response }); - - console.log("- out leaveRoom controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -280,12 +270,11 @@ export class ChatController { @Get('messages') async getMessages(@Req() req, @Res() res): Promise { - console.log("- in getMessages controller"); + printCaller("- in "); const messages = await this.chatService.getMessagesFromCurrentRoom(req.user.username); res.status(HttpStatus.OK).json({ messages: messages }); - - console.log("- out getMessages controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -293,14 +282,13 @@ export class ChatController { @Get('roomusers') async getRoomUsers(@Req() req, @Res() res): Promise { - console.log("- in getRoomUsers controller"); + printCaller("- in "); const room_name = await this.chatService.getCurrentRoomName(req.user.username); const room = await this.chatService.getRoomByName(room_name); const users = room.users; res.status(HttpStatus.OK).json({ users: users }); - - console.log("- out getRoomUsers controller"); + printCaller("- out "); } @UseGuards(AuthenticateGuard) @@ -308,13 +296,12 @@ export class ChatController { @Get('users') async getAllUsers(@Req() req, @Res() res): Promise { - console.log("- in getAllUsers controller"); + printCaller("- in "); const room_name = await this.chatService.getCurrentRoomName(req.user.username); const users = await this.chatService.getAllUsersNotInRoom(room_name); res.status(HttpStatus.OK).json({ users: users }); - - console.log("- out getAllUsers controller"); + printCaller("- out "); } } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index b0618d62..0eac1fd5 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -8,6 +8,7 @@ import { roomDto } from './dto/room.dto'; import { messagesDto } from './dto/messages.dto'; import { socketDto } from './dto/socket.dto'; import * as bcrypt from 'bcrypt'; +import { printCaller } from './dev/dev_utils'; @Injectable() @@ -32,7 +33,7 @@ export class ChatService { async getMyRooms(username: string, fieldsToReturn: string[] = null): Promise { - console.log("-- in getMyRooms service"); + printCaller("-- in "); const queryBuilder = this.chatroomRepository .createQueryBuilder('chatroom') @@ -46,36 +47,36 @@ export class ChatService { const rooms = await queryBuilder.getMany(); - console.log("-- out getMyRooms service"); + printCaller("-- out "); return rooms; } async getMyDirects(username: string): Promise { - console.log("-- in getAllNotMyRooms service"); + printCaller("-- in "); const my_rooms = await this.getMyRooms(username); const directs = my_rooms.filter(room => room.type === 'direct'); - console.log("-- out getAllNotMyRooms service"); + printCaller("-- out "); return directs; } async getAllRooms(): Promise { - console.log("-- in getAllRooms service"); + printCaller("-- in "); const rooms = await this.chatroomRepository .createQueryBuilder('chatroom') .getMany(); - console.log("-- out getAllRooms service"); + printCaller("-- out "); return rooms; } async getAllNotMyRooms(username: string): Promise { - console.log("-- in getAllNotMyRooms service"); + printCaller("-- in "); const user_db = await this.getUserByName(username); const rooms = await this.chatroomRepository @@ -84,13 +85,13 @@ export class ChatService { .andWhere('chatroom.users NOT LIKE :user_name', { user_name: `%${username}%` }) .getMany(); - console.log("-- out getAllNotMyRooms service"); + printCaller("-- out "); return rooms; } async getAllOtherRoomsAndUsers(username: string): Promise { - console.log("-- in getAllOtherRoomsAndUsers service"); + printCaller("-- in "); const all_rooms = await this.getAllNotMyRooms(username); const all_users = await this.getAllUsersNotMyRooms(username); @@ -99,23 +100,25 @@ export class ChatService { return { name: room.name, type: room.type, + protection: room.protection, }; }); let users = all_users.map(user => { return { name: user.username, type: "user", + protection: false, }; }); let rooms: roomDto[] = row_rooms.concat(users); - console.log("-- in getAllOtherRoomsAndUsers service"); + printCaller("-- out "); return rooms; } async getMessagesFromCurrentRoom(username: string): Promise { - console.log("-- in getMessagesFromCurrentRoom service"); + printCaller("-- in "); const user_db = await this.getUserByName(username); const currentRoom = await this.getRoomByName(user_db.currentRoom); @@ -123,23 +126,23 @@ export class ChatService { if (currentRoom) messages = currentRoom.messages; - console.log("-- out getMessagesFromCurrentRoom service"); + printCaller("-- out "); return messages; } async getCurrentRoomName(username: string): Promise { - console.log("-- in getCurrentRoomName service"); + printCaller("-- in "); const user_db = await this.getUserByName(username); - console.log("-- out getCurrentRoomName service"); + printCaller("-- out "); return user_db.currentRoom; } async getRoomByName(room_name: string, fieldsToReturn: string[] = null): Promise { - console.log("-- in getRoomByName service"); + printCaller("-- in "); const queryBuilder = this.chatroomRepository .createQueryBuilder('chatroom') @@ -153,20 +156,20 @@ export class ChatService { const room = await queryBuilder.getOne(); - console.log("-- out getRoomByName service"); + printCaller("-- out "); return room; } async getRoomById(id: number): Promise { - console.log("-- in getRoomById service"); + printCaller("-- in "); const room = await this.chatroomRepository .createQueryBuilder('chatroom') .where('chatroom.id = :id', { id: id }) .getOne(); - console.log("-- out getRoomById service"); + printCaller("-- out "); return room; } @@ -176,32 +179,31 @@ export class ChatService { async setCurrentRoom(username: string, room_name: string): Promise { - console.log("-- in setCurrentRoom service"); + printCaller("-- in "); const user_db = await this.getUserByName(username); user_db.currentRoom = room_name; await this.userRepository.save(user_db); - console.log("-- out setCurrentRoom service"); + printCaller("-- out "); return `room "${room_name}" is now current room`; } async setPasswordValidation(username: string, room: roomDto): Promise { - console.log("-- in setPasswordValidation service"); + printCaller("-- in "); const room_db = await this.getRoomByName(room.name); const is_match = await bcrypt.compare(room.password, room_db.hash); if (!is_match) { - console.log(`throw error: display: true, code: 'BAD_PASSWORD', message: 'bad password'`); - throw new HttpException({ display: true, code: 'BAD_PASSWORD', message: `bad password` }, HttpStatus.OK); + console.log(`throw error: error: true, code: 'BAD_PASSWORD', message: 'bad password'`); + throw new HttpException({ error: true, code: 'BAD_PASSWORD', message: `bad password` }, HttpStatus.BAD_REQUEST); } room_db.allowed_users.push(username); + printCaller("-- out "); await this.chatroomRepository.save(room_db); - - console.log("-- out setPasswordValidation service"); } @@ -210,13 +212,13 @@ export class ChatService { async addUserToNewRoom(username: string, room: roomDto): Promise { - console.log("-- in addUserToNewRoom service"); + printCaller("-- in "); const find_room = await this.getRoomByName(room.name); if (find_room) { - console.log("throw error: display: true, code: 'ROOM_CONFLICT', message: 'This room name already exist'"); - throw new HttpException({ display: true, code: 'ROOM_CONFLICT', message: `This room name already exist` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'ROOM_CONFLICT', message: 'This room name already exist'"); + throw new HttpException({ error: true, code: 'ROOM_CONFLICT', message: `This room name already exist` }, HttpStatus.OK); } let hash; @@ -225,8 +227,8 @@ export class ChatService { console.log("in room protection hash"); if (room.type === 'direct') { - console.log("throw error: display: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); - throw new HttpException({ display: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room`}, HttpStatus.OK); + console.log("throw error: error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); + throw new HttpException({ error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room`}, HttpStatus.OK); } const saltOrRounds = 10; const password = room.password; @@ -240,6 +242,7 @@ export class ChatService { newChatroom.owner = username; newChatroom.users = room.users; newChatroom.allowed_users = []; + newChatroom.protection = room.protection; if (room.protection) { newChatroom.hash = hash; @@ -251,13 +254,12 @@ export class ChatService { { name: "SERVER", message: `${room.users[0]} joined the room` }, ]; await this.chatroomRepository.save(newChatroom); - - console.log("-- out addUserToNewRoom service"); + printCaller("-- out "); } async addUserToRoom(username: string, room_name: string): Promise { - console.log("-- in addUserToRoom service"); + printCaller("-- in "); const room = await this.getRoomByName(room_name); @@ -265,13 +267,13 @@ export class ChatService { room.users.push(username); await this.chatroomRepository.save(room); - console.log("-- out addUserToRoom service"); + printCaller("-- out "); return room; } async addMessageToRoom(room_name: string, username: string, message: string): Promise { - console.log("-- in addMessageToRoom service"); + printCaller("-- in "); const my_room = await this.getRoomByName(room_name); let chat_message: messagesDto = { @@ -279,9 +281,9 @@ export class ChatService { message: message, }; my_room.messages.push(chat_message); - await this.chatroomRepository.save(my_room); - console.log("-- out addMessageToRoom service"); + printCaller("-- out "); + await this.chatroomRepository.save(my_room); } @@ -290,18 +292,18 @@ export class ChatService { async removeUserFromRoom(username: string, room_name: string): Promise { - console.log("-- in removeUserFromRoom service"); + printCaller("-- in "); const room = await this.getRoomByName(room_name); if (!room.users.includes(username)) { - console.log("throw error: display: true, code: 'USER_NOT_FOUND', message: 'your are not in this room'"); - throw new HttpException({ display: true, code: 'USER_NOT_FOUND', message: `your are not in this room` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'USER_NOT_FOUND', message: 'your are not in this room'"); + throw new HttpException({ error: true, code: 'USER_NOT_FOUND', message: `your are not in this room` }, HttpStatus.OK); } if (room.type === "direct") { - console.log("throw error: display: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: 'you cannot leave a direct messages conversation'"); - throw new HttpException({ display: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: `you cannot leave a direct messages conversation` }, HttpStatus.OK); + console.log("throw error: error: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: 'you cannot leave a direct messages conversation'"); + throw new HttpException({ error: true, code: 'LEAVE_DIRECY_FORBIDDEN', message: `you cannot leave a direct messages conversation` }, HttpStatus.OK); } // delete user from room @@ -309,7 +311,7 @@ export class ChatService { room.users = room.users.filter(name => name !== username); await this.chatroomRepository.save(room); - console.log("-- out removeUserFromRoom service"); + printCaller("-- out "); return "successfully leaving room"; } @@ -319,20 +321,20 @@ export class ChatService { async getUserByName(username: string): Promise { - console.log("-- in getUserByName service"); + printCaller("-- in "); const user = await this.userRepository .createQueryBuilder('user') .where('user.username = :name', { name: username }) .getOne(); - console.log("-- out getUserByName service"); + printCaller("-- out "); return user; } async getAllUsersNotMyRooms(username: string): Promise { - console.log("-- in getAllUsersNotMyRooms service"); + printCaller("-- in "); const directs = await this.getMyDirects(username); @@ -350,13 +352,13 @@ export class ChatService { .where('user.username NOT IN (:...usernames)', { usernames: usernames }) .getMany(); - console.log("-- out getAllUsersNotMyRooms service"); + printCaller("-- out "); return users; } async getAllUsersNotInRoom(current_room_name: string): Promise { - console.log("-- in getAllUsersNotInRoom service"); + printCaller("-- in "); // get all users in current room const current_room = await this.getRoomByName(current_room_name); @@ -367,7 +369,7 @@ export class ChatService { .where('user.username NOT IN (:...usernames)', { usernames: usernames }) .getMany(); - console.log("-- out getAllUsersNotInRoom service"); + printCaller("-- out "); return users; } @@ -377,29 +379,29 @@ export class ChatService { async socketIncommingMessage(socket: socketDto, message: string): Promise { - console.log("-- in handleSocketIncommingMessage service"); + printCaller("-- in "); socket.to(socket.room).emit('message', socket.username, message); let room_name = await this.getCurrentRoomName(socket.username); await this.addMessageToRoom(room_name, socket.username, message); - console.log("-- out handleSocketIncommingMessage service"); + printCaller("-- out "); } async socketChangeRoom(socket: socketDto, room_name: string): Promise { - console.log('-- in socketChangeRoom service'); + printCaller("-- in "); socket.leave(socket.room); socket.join(room_name); socket.room = room_name; - console.log('-- out socketChangeRoom service'); + printCaller("-- out "); } async socketJoinRoom(socket: socketDto, room_name: string): Promise { - console.log('-- in socketJoinRoom service'); + printCaller("-- in "); socket.leave(socket.room); socket.join(room_name); @@ -408,7 +410,7 @@ export class ChatService { await socket.to(socket.room).emit('message', "SERVER", message); await this.addMessageToRoom(room_name, "SERVER", message); - console.log('-- out socketJoinRoom service'); + printCaller("-- out "); } } diff --git a/srcs/requirements/nestjs/api_back/src/chat/dev/dev_utils.ts b/srcs/requirements/nestjs/api_back/src/chat/dev/dev_utils.ts new file mode 100644 index 00000000..1d37db38 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/chat/dev/dev_utils.ts @@ -0,0 +1,13 @@ +export function printCaller(prefix: string = "") { + try + { + throw new Error(); + } + catch (e) + { + Error.captureStackTrace(e); + let stack = e.stack.split('\n'); + let caller = stack[2].trim(); + console.log(prefix + caller); + } +} diff --git a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts index c4dfba54..578aadf3 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/dto/room.dto.ts @@ -17,8 +17,7 @@ export class roomDto type: string; @IsBoolean() - @IsOptional() - protection?: boolean = false; + protection: boolean; @IsString() @IsOptional() diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte index e91ac23f..de6a64e5 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte @@ -30,8 +30,8 @@ */ function set_layouts($layout) { - console.log("layouts:", layouts); - console.log("layout:", $layout); + //console.log("layouts:", layouts); + //console.log("layout:", $layout); if ($layout.length === 0) layout.set(layouts[0]); else if ($layout === "close") @@ -42,7 +42,7 @@ layouts = [$layout, "home"]; else layouts = [$layout, layouts[0]]; - console.log("- layouts:", layouts); + //console.log("- layouts:", layouts); } $: set_layouts($layout); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte index fd976639..ee22198c 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_create.svelte @@ -14,7 +14,6 @@ onMount(async() => { let response = await fetch('/api/v2/chat/allowedchars'); let data = await response.json(); - console.log("data:", data); allowed_chars = data.chars; //regex = new RegExp(`^[a-zA-Z0-9\\s${allowed_chars}]+$`); }); @@ -40,12 +39,14 @@ }; if (is_protected === true) room.password = room_password; + // send the new room response = await create_room(room); - show_error = response.display; // go to room - if (response.status === 200) + if (response.error) + show_error = response.error; + else await change_room(response.room); } diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte index 679e5c5d..2ccac35a 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte @@ -1,6 +1,6 @@ diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte index b2f7abf7..36aa78a5 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte @@ -1,6 +1,6 @@ - diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte index 096d2733..044a7437 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_home.svelte @@ -55,7 +55,7 @@

rooms are loading...

{:then rooms} {#each rooms as room} - {/each} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte index 36aa78a5..10b86d4b 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_invite.svelte @@ -52,7 +52,7 @@

users are loading...

{:then users} {#each users as user} - {/each} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte index 77c5af26..a6940d57 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_new.svelte @@ -56,7 +56,7 @@

rooms are loading...

{:then rooms} {#each rooms as room} - {/each} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room.svelte index 03a0e918..49de63a7 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room.svelte @@ -71,7 +71,7 @@
- diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte index cdd986af..018c3ecc 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte @@ -8,9 +8,26 @@ let users = get_room_users(); + console.log("current_room:", $current_room); + + function change_password() + { + console.log("in change_password"); + } + + function remove_password() + { + console.log("in remove_password"); + } + + function add_password() + { + console.log("in add_password"); + } + function user_profile() { - console/log("in user_profile"); + console.log("in user_profile"); } function user_leave_room() @@ -42,13 +59,26 @@
{#if $current_room.type !== "direct"} - {/if} + {#if $current_room.protection } +

this room is password protected

+ + + {:else} + + {/if}

room users :

@@ -58,7 +88,7 @@

list of users is loading...

{:then users} {#each users as user} - {/each} From b72042a263fa3b70b1e2777a8c89c01502318b93 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sun, 15 Jan 2023 00:00:35 +0100 Subject: [PATCH 33/40] Game invitation from chat WIP (missing username) + fetchUser() and fetchAllUsers() + changes accept/declineInvitation() --- .../nestjs/api_back/src/game/game.service.ts | 12 ++++--- .../api_front/src/pages/game/Game.svelte | 26 ++++++++++---- .../src/pages/game/GameSpectator.svelte | 35 +++++++++--------- .../src/pieces/chat/Layout_user.svelte | 11 +++++- .../api_front/src/pieces/store_invitation.ts | 4 +++ .../svelte/api_front/src/pieces/utils.ts | 36 +++++++++++++++++++ 6 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 srcs/requirements/svelte/api_front/src/pieces/store_invitation.ts diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index d6ca27c5..4e6d4805 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -200,8 +200,10 @@ export class GameService { async declineInvitation(user : User, token : string, @Res() res : Response) { - if (user.status !== STATUS.CONNECTED) - return res.status(HttpStatus.FORBIDDEN).json({message : "You must not be in game to decline an invitation"}); + /* Luke: le check de user.status n'est pas fonctionnel avec l'implémentation des invitations dans le front. + Ça me semble dispensable, je désactive donc pour le moment plutôt que de refaire l'implémentation front. */ + // if (user.status !== STATUS.CONNECTED) + // return res.status(HttpStatus.FORBIDDEN).json({message : "You must not be in game to decline an invitation"}); console.log("On décline l'invitation") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) @@ -236,8 +238,10 @@ export class GameService { async acceptInvitation(user : User, token : string, @Res() res : Response) { - if (user.status !== STATUS.CONNECTED) - return res.status(HttpStatus.FORBIDDEN).send("") + /* Luke: le check de user.status n'est pas fonctionnel avec l'implémentation des invitations dans le front. + Ça me semble dispensable, je désactive donc pour le moment plutôt que de refaire l'implémentation front. */ + // if (user.status !== STATUS.CONNECTED) + // return res.status(HttpStatus.FORBIDDEN).send("") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .andWhere('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokenGame.token = :token', {token : token}) diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index b45ab9bb..893aeb93 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -4,11 +4,13 @@ import { fade, fly } from 'svelte/transition'; import Header from '../../pieces/Header.svelte'; - import { fetchAvatar } from "../../pieces/utils"; + import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils"; import * as pong from "./client/pong"; import { gameState } from "./client/ws"; + import { invited_username } from '../../pieces/store_invitation'; + //user's stuff let user; let allUsers; @@ -36,11 +38,21 @@ const watchMatchStartIntervalRate = 111; onMount( async() => { - user = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`) - .then( x => x.json() ); - allUsers = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/all`) - .then( x => x.json() ); + user = await fetchUser(); + allUsers = await fetchAllUsers(); + + if (!user) { + showError = true; + errorMessage = "User load failed"; + return; + } + options.playerOneUsername = user.username; + if ($invited_username) { + options.isSomeoneIsInvited = true; + options.playerTwoUsername = $invited_username; + invited_username.set(""); + } }) onDestroy( async() => { @@ -298,8 +310,8 @@ {#if options.isSomeoneIsInvited} {/if} diff --git a/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte b/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte index d0ba4bc7..dfa4d63b 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte @@ -6,15 +6,11 @@ import Header from '../../pieces/Header.svelte'; import MatchListElem from "../../pieces/MatchListElem.svelte"; import type { Match } from "../../pieces/Match"; - import { fetchAvatar } from "../../pieces/utils"; + import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils"; import * as pongSpectator from "./client/pongSpectator"; import { gameState } from "./client/ws"; - //user's stuff - let user; - let allUsers; - let playerOneAvatar; let playerTwoAvatar; @@ -30,13 +26,7 @@ const watchGameStateIntervalRate = 142; onMount( async() => { - user = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`) - .then( x => x.json() ); - allUsers = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/all`) - .then( x => x.json() ); - const responseForMatchList = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) - const jsonForMatchList = await responseForMatchList.json(); - matchList = jsonForMatchList; + matchList = await fetchMatchList(); }) onDestroy( async() => { @@ -82,12 +72,25 @@ async function resetPage() { hiddenGame = true; pongSpectator.destroy(); - fetchMatchList(); + matchList = await fetchMatchList(); }; - async function fetchMatchList() { - matchList = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) - .then( x => x.json() ); + async function fetchMatchList() + { + return fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) + .then((response) => { + if (!response.ok) { + throw new Error("All matchs not retrieved"); + } + return response.json(); + }) + .then((body) => { + return body; + }) + .catch((error) => { + console.log("catch fetchMatchList: ", error); + return []; + }); }; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte index 7fe25b94..b5abf6f3 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte @@ -8,6 +8,15 @@ let mute = "mute"; let block = "block"; + import { push } from "svelte-spa-router"; + import { invited_username } from '../store_invitation'; + function game_invitation() + { + const usernamePLACEHOLDER = "hulamy"; + invited_username.set(usernamePLACEHOLDER); + push("/game"); + } +
@@ -40,7 +49,7 @@ - - - - - - - - - - - -
From f364d82f8e35d81eb9fe69448b2b279b26ccee41 Mon Sep 17 00:00:00 2001 From: simplonco Date: Sun, 15 Jan 2023 01:08:39 +0100 Subject: [PATCH 37/40] forgot to add : deleted temp buttons to access layout in front --- .../svelte/api_front/src/pieces/chat/Layout_password.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte index 217ea1c0..95524f5e 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte @@ -8,6 +8,7 @@ export let back = ""; export let mode = "add"; + let password_state = ""; if (mode === 'change') password_state = "new"; From 4342da67498a61fe87e6dfb7846dcef4f476524b Mon Sep 17 00:00:00 2001 From: simplonco Date: Sun, 15 Jan 2023 02:11:45 +0100 Subject: [PATCH 38/40] modify password ok --- README.md | 2 +- .../api_back/src/chat/chat.controller.ts | 55 ++++++++- .../nestjs/api_back/src/chat/chat.service.ts | 105 +++++++++--------- .../src/pieces/chat/Chat_layouts.svelte | 3 + .../src/pieces/chat/Layout_password.svelte | 22 +++- .../src/pieces/chat/Layout_room_set.svelte | 2 +- .../src/pieces/chat/Request_rooms.ts | 46 +++++++- .../api_front/src/pieces/chat/Types_chat.ts | 2 +- 8 files changed, 171 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index df043e84..300c2d9d 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ - [/] leave room - [/] leave direct impossible - [/] protect room with password -- [ ] add and change password in room +- [/] add, change, and remove password in room - [ ] make admin - [ ] ban - [ ] mute diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index 4f789b25..a2570d8d 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -140,8 +140,11 @@ export class ChatController { if (room.protection) { + let message = `${req.user.username} changed the password`; + room.allowed_users = [req.user.username]; + await this.chatService.setPassword(req.user.username, message, room); let socket: socketDto = this.chatGateway.sockets.get(req.user.username); - await this.chatService.addPassword(req.user.username, room, socket); + await socket.to(socket.room).emit('message', "SERVER", message); } const ret_room = this.format_room(room); @@ -255,8 +258,56 @@ export class ChatController { { printCaller("- in "); + let message = `${req.user.username} changed the password`; + room.allowed_users = [req.user.username]; + room.protection = true; + await this.chatService.setPassword(req.user.username, message, room, old_password); + + // inform other connected users let socket: socketDto = this.chatGateway.sockets.get(req.user.username); - await this.chatService.addPassword(req.user.username, room, socket, old_password); + await socket.to(socket.room).emit('message', "SERVER", message); + + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); + printCaller("- out "); + } + + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Post('addpassword') + async addPassword(@Body() room: roomDto, @Req() req, @Res() res): Promise + { + printCaller("- in "); + + let message = `${req.user.username} added a password`; + room.allowed_users = [req.user.username]; + room.protection = true; + await this.chatService.setPassword(req.user.username, message, room); + + // inform other connected users + let socket: socketDto = this.chatGateway.sockets.get(req.user.username); + await socket.to(socket.room).emit('message', "SERVER", message); + + const ret_room = this.format_room(room); + res.status(HttpStatus.OK).json({ room: ret_room }); + printCaller("- out "); + } + + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Delete('removepassword') + async removePassword(@Body() room: roomDto, @Req() req, @Res() res): Promise + { + printCaller("- in "); + + let message = `${req.user.username} removed a new password`; + room.allowed_users = []; + room.protection = false; + await this.chatService.setPassword(req.user.username, message, room); + + // inform other connected users + let socket: socketDto = this.chatGateway.sockets.get(req.user.username); + await socket.to(socket.room).emit('message', "SERVER", message); const ret_room = this.format_room(room); res.status(HttpStatus.OK).json({ room: ret_room }); diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index d6001b6d..e094920f 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -206,6 +206,60 @@ export class ChatService { await this.chatroomRepository.save(room_db); } + async setPassword(username: string, message: string, room: roomDto, old_password?: string): Promise + { + printCaller("-- in "); + + if (room.type === 'direct') + { + console.log("throw error: error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); + throw new HttpException({ error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room` }, HttpStatus.FORBIDDEN); + } + + const current_room = await this.getRoomByName(room.name); + + if (!room.password) + { + console.log("throw error: error: true, code: 'NO_PASSWORD', message: 'this room has no password protection'"); + throw new HttpException({ error: true, code: 'NO_PASSWORD', message: `this room has no password protection` }, HttpStatus.FORBIDDEN); + } + if (current_room.protection) + { + if (room.protection && !old_password) + { + console.log("throw error: error: true, code: 'MISSING_OLD_PASSWORD', message: 'you need to provide the old password to set a new one'"); + throw new HttpException({ error: true, code: 'MISSING_OLD_PASSWORD', message: `you need to provide the old password to set a new one` }, HttpStatus.FORBIDDEN); + } + if (old_password) + { + const is_match = await bcrypt.compare(old_password, current_room.hash); + if (!is_match) + { + printCaller(`throw error: error: true, code: 'BAD_PASSWORD', message: 'you provided a bad password'`); + throw new HttpException({ error: true, code: 'BAD_PASSWORD', message: `you provided a bad password` }, HttpStatus.BAD_REQUEST); + } + } + } + + const saltOrRounds = 10; + const password = room.password; + let hash: string; + if (room.protection) + hash = await bcrypt.hash(password, saltOrRounds); + + // add password to chatroom + current_room.allowed_users = room.allowed_users; + current_room.protection = room.protection; + if (room.protection) + current_room.hash = hash; + else + delete current_room.hash; + current_room.messages.push({ name: "SERVER", message: message }); + await this.chatroomRepository.save(current_room); + + printCaller("-- out "); + } + /* ADDERS ************************************************* */ @@ -252,57 +306,6 @@ export class ChatService { return room; } - async addPassword(username: string, room: roomDto, socket:socketDto, old_password?: string): Promise - { - printCaller("-- in "); - - if (room.type === 'direct') - { - console.log("throw error: error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: 'you cannot set a password in a direct message room'"); - throw new HttpException({ error: true, code: 'DIRECT_PASSWORD_FORBIDDEN', message: `you cannot set a password in a direct message room` }, HttpStatus.FORBIDDEN); - } - - const current_room = await this.getRoomByName(room.name); - - let message = `${username} set a new password`; - - if (current_room.protection) - { - if (!old_password) - { - console.log("throw error: error: true, code: 'MISSING_OLD_PASSWORD', message: 'you need to provide the old password to set a new one'"); - throw new HttpException({ error: true, code: 'MISSING_OLD_PASSWORD', message: `you need to provide the old password to set a new one` }, HttpStatus.FORBIDDEN); - } - const is_match = await bcrypt.compare(old_password, current_room.hash); - if (!is_match) - { - printCaller(`throw error: error: true, code: 'BAD_PASSWORD', message: 'you provided a bad password'`); - throw new HttpException({ error: true, code: 'BAD_PASSWORD', message: `you provided a bad password` }, HttpStatus.BAD_REQUEST); - } - } - - const saltOrRounds = 10; - const password = room.password; - let hash = await bcrypt.hash(password, saltOrRounds); - - // add password to chatroom - if (!current_room.allowed_users.includes(username)) - current_room.allowed_users.push(username); - current_room.protection = true; - current_room.hash = hash; - current_room.messages.push({ name: "SERVER", message: message }); - await this.chatroomRepository.save(current_room); - - console.log("current_room:", current_room); - const all_rooms = await this.getAllRooms(); - console.log("all_rooms:", all_rooms); - - // inform other connected users - await socket.to(socket.room).emit('message', "SERVER", message); - - printCaller("-- out "); - } - async addMessageToRoom(room_name: string, username: string, message: string): Promise { printCaller("-- in "); diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte index 68f4fe16..55ae3216 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat_layouts.svelte @@ -67,6 +67,9 @@ {:else if $layout === "password"} + + + {:else if $layout === "add_password"} {:else if $layout === "change_password"} diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte index 95524f5e..d2d87f92 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_password.svelte @@ -1,13 +1,13 @@ -

We are sorry!

-

This isn't a url that we use.

-

Go home you're drunk.

-
-

Take me home →

-
\ No newline at end of file + +
+
+

We are sorry!

+

This isn't a url that we use.

+

Go home you're drunk.

+
+
+ + \ No newline at end of file diff --git a/srcs/requirements/svelte/api_front/src/pages/SplashPage.svelte b/srcs/requirements/svelte/api_front/src/pages/SplashPage.svelte index 996728b8..f3dccddf 100644 --- a/srcs/requirements/svelte/api_front/src/pages/SplashPage.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/SplashPage.svelte @@ -78,8 +78,8 @@ .button-in { background-color: #8c0000; - border-color: black; - border-width: 4px; + border-color: #071013; + border-width: 2px; color: white; font-family: "Bit5x3"; font-size: x-large; @@ -88,8 +88,8 @@ .button-out { background-color: #008c8c; - border-color: black; - border-width: 4px; + border-color: #071013; + border-width: 2px; color: white; font-family: "Bit5x3"; font-size: x-large; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte index 5585b051..af39892f 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte @@ -28,7 +28,7 @@

- +
@@ -59,6 +59,7 @@
+
diff --git a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte index 71c780c6..8dc48d37 100644 --- a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileFriends.svelte @@ -24,22 +24,10 @@ onMount( async() => { - // DO I ACTUALLY NEED TO ON MOUNT ALL THIS STUFF? - // ALSO I COULD JUST USE THE FUNCITONS I MADE... - - - // yea no idea what - // i mean do i fetch user? i will for now user = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`) .then( (x) => x.json() ); fetchAll(); - // ok this shit works! - // const interval = setInterval(() => { - // fetchAll(); - // }, 1000); - - // return () => clearInterval(interval); }); const fetchAll = async() => { @@ -234,6 +222,7 @@ +
@@ -353,7 +342,7 @@
- +
From fa8e3d74730f15655bb35e99a9614459106b21e6 Mon Sep 17 00:00:00 2001 From: cherif Date: Sun, 15 Jan 2023 18:07:23 +0100 Subject: [PATCH 40/40] changements de le couleur et de la font sur l'ensemble du site. --- .../svelte/api_front/src/pages/profile/ProfileSettings.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileSettings.svelte b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileSettings.svelte index 577fdc17..738dd392 100644 --- a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileSettings.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileSettings.svelte @@ -193,6 +193,7 @@ .inline-check{ display: inline; + color: #333; }