From 20ea0bcef5e8351e22b254318686fe02ba3d962f Mon Sep 17 00:00:00 2001 From: simplonco Date: Mon, 16 Jan 2023 13:35:15 +0100 Subject: [PATCH] interaction blocked users and view profile ok, still block message todo --- .../api_back/src/chat/chat.controller.ts | 32 ++++- .../nestjs/api_back/src/chat/chat.module.ts | 5 +- .../nestjs/api_back/src/chat/chat.service.ts | 109 +++++++++++++++++- .../src/users/entities/user.entity.ts | 3 - .../api_front/src/pieces/chat/Chat.svelte | 8 +- .../src/pieces/chat/Layout_room.svelte | 3 +- .../src/pieces/chat/Layout_room_set.svelte | 7 +- .../src/pieces/chat/Layout_settings.svelte | 40 ++++--- .../src/pieces/chat/Layout_user.svelte | 36 +++--- .../src/pieces/chat/Request_rooms.ts | 57 +++++---- .../api_front/src/pieces/chat/Store_chat.ts | 16 +-- .../api_front/src/pieces/chat/Types_chat.ts | 5 +- 12 files changed, 240 insertions(+), 81 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 bf2826cd..a0c0abcd 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -116,7 +116,7 @@ export class ChatController { const room_db = await this.chatService.getRoomByName(room_name, fields); const is_admin = room_db.admins.includes(req.user.username); - res.status(HttpStatus.OK).json({ is_admin: is_admin }); + res.status(HttpStatus.OK).json({ condition: is_admin }); printCaller("- out "); } @@ -418,6 +418,7 @@ export class ChatController { const room = await this.chatService.getRoomByName(room_name); const users = room.users; const admins = room.admins; + const blocked = await this.chatService.getListBlockUser(req.user.username); let index = users.indexOf(req.user.username); if (index > -1) @@ -429,9 +430,13 @@ export class ChatController { { name: username, isadmin: false, + isblocked: false, }; if (admins.includes(username)) new_user.isadmin = true; + if (blocked.includes(username)) + new_user.isblocked = true; + console.log("new_user:", new_user); return new_user; }); @@ -532,7 +537,8 @@ export class ChatController { { printCaller("- in "); - await this.chatService.setBlockUser(req.user.username, username); + await this.chatService.addBlockUser(req.user.username, username); + let user_socket: socketDto = this.chatGateway.sockets.get(req.user.username); user_socket.join(`${username}_not_emit`); @@ -547,6 +553,7 @@ export class ChatController { { printCaller("- in "); + await this.chatService.removeBlockUser(req.user.username, username); let user_socket: socketDto = this.chatGateway.sockets.get(req.user.username); user_socket.leave(`${username}_not_emit`); @@ -554,5 +561,26 @@ export class ChatController { printCaller("- out "); } + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Get('listblock') + async listBlockUser(@Req() req, @Res() res): Promise + { + printCaller("- in "); + + let block_users = await this.chatService.getListBlockUser(req.user.username); + let users = block_users.map(user => + { + return { + name: user, + isadmin: false, + isblocked: true, + } + }); + + res.status(HttpStatus.OK).json({ users: users }); + printCaller("- out "); + } + } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.module.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.module.ts index 1ab18c9d..a35d3f0e 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.module.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.module.ts @@ -3,14 +3,17 @@ import { ChatController } from './chat.controller'; import { ChatService } from './chat.service'; import { ChatGateway } from './chat.gateway'; import { UsersModule } from 'src/users/users.module'; +import { FriendshipsModule } from 'src/friendship/friendships.module'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Chatroom } from './entities/chatroom.entity'; import { User } from 'src/users/entities/user.entity'; +import { Friendship } from 'src/friendship/entities/friendship.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([Chatroom, User]), + TypeOrmModule.forFeature([Chatroom, User, Friendship]), UsersModule, + FriendshipsModule, ], controllers: [ ChatController, 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 7dae88f3..cfbca870 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -1,8 +1,11 @@ import { HttpException, HttpStatus, Injectable, Res } from '@nestjs/common'; import { User } from 'src/users/entities/user.entity'; -import { UsersService } from 'src/users/users.service'; +import { Friendship, FriendshipStatus } from 'src/friendship/entities/friendship.entity'; import { Chatroom } from './entities/chatroom.entity'; -import { Repository } from 'typeorm'; +import { UsersService } from 'src/users/users.service'; +import { FriendshipService } from 'src/friendship/friendship.service'; +import { SendableFriendship } from 'src/friendship/sendableFriendship'; +import { Repository, Brackets } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { roomDto } from './dto/room.dto'; import { messagesDto } from './dto/messages.dto'; @@ -17,10 +20,13 @@ export class ChatService { constructor( private usersService: UsersService, + private friendshipService: FriendshipService, @InjectRepository(User) private readonly userRepository: Repository, @InjectRepository(Chatroom) private readonly chatroomRepository: Repository, + @InjectRepository(Friendship) + private readonly friendshipRepository: Repository, ) {} // temp for test @@ -298,14 +304,111 @@ export class ChatService { printCaller("-- out "); } - async setBlockUser(username: string, to_block_username: string): Promise + async findOneRelationshipByUsername(friendUsername : string, username : string) + { + const friendship = await this.friendshipRepository + .createQueryBuilder('friendship') + .leftJoinAndSelect('friendship.sender', 'sender') + .leftJoinAndSelect('friendship.receiver', 'receiver') + .where + ( + new Brackets((qb) => + { + qb.where + ( + new Brackets((subAQb) => + { + subAQb.where('sender.username = :username', {username : username}) + .andWhere('receiver.username = :friendUsername', {friendUsername : friendUsername}) + }) + ) + .orWhere + ( + new Brackets((subBQb) => + { + subBQb.where('sender.username = :friendUsername2', {friendUsername2 : friendUsername}) + .andWhere('receiver.username = :username2', {username2 : username}) + .andWhere('friendship.status != :status', {status : FriendshipStatus.BLOCKED}) + }) + ) + }), + ) + .getOne() + + if (!friendship) + return null; + return new SendableFriendship(friendship); + } + + async addBlockUser(username: string, to_block_username: string): Promise { printCaller("-- in "); + let user = await this.getUserByName(username); + let relation = await this.findOneRelationshipByUsername(to_block_username, username); + if (relation) + { + let blocked_friendship = await this.friendshipService.blockFriendship(relation.id, user); + } + else + { + const newFriendshipDto = {"receiverUsername": to_block_username, "status": FriendshipStatus.BLOCKED}; + await this.friendshipService.create(newFriendshipDto, user); + } printCaller("-- out "); } + async removeBlockUser(username: string, to_unblock_username: string): Promise + { + printCaller("-- in "); + + let user = await this.getUserByName(username); + let relation = await this.findOneRelationshipByUsername(to_unblock_username, username); + await this.friendshipService.removeFriendship(relation.id, user); + + printCaller("-- out "); + } + + async getListBlockUser(username: string): Promise + { + printCaller("-- in "); + + let user = await this.getUserByName(username); + let friends_users = await this.friendshipService.findAllBlockedFriends(user.id); + let users = friends_users.map(user => user.receiverUsername); + console.log(users); + + printCaller("-- out "); + return users; + } + +/* + // find list blocked + + findAllBlockedFriends + extract the receiver_username (i am the sender) + + + // bock a user + + findfriendshipbyname + return friendship + blockfriendship + return nothing + createfriendship + return friendship (it worked) + return http exception (cannot create friendship) + + + // unblock + + findfriendshipbyname + return friendship + removefriendship + return nothing +*/ + /* ADDERS ************************************************* */ diff --git a/srcs/requirements/nestjs/api_back/src/users/entities/user.entity.ts b/srcs/requirements/nestjs/api_back/src/users/entities/user.entity.ts index 7d4684ed..9b2bc897 100644 --- a/srcs/requirements/nestjs/api_back/src/users/entities/user.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/users/entities/user.entity.ts @@ -57,7 +57,4 @@ export class User { @Column({ nullable: true }) currentRoom: string; // chatroom name - - @Column("simple-array", { nullable: true }) - blockedUsers: string[]; // usernames } diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte index 4d6b65b2..2fd98a7c 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte @@ -9,7 +9,7 @@ lines_width: "1px", lines_color: "rgb(30, 30, 30)", lines_light_color: "rgb(70, 70, 70)", - bg_color: "rgb(251, 156, 81)", + bg_color: "rgb(251, 139, 36)", bg_light_color: "rgb(251, 156, 81)", btn_color: "rgb(220, 220, 220)", @@ -28,6 +28,8 @@ chat_other_color: "rgb(250, 250, 250)", chat_other_bg_color: "rgb(190, 130, 70)", chat_serveur_color: "rgb(110, 110, 110)", + chat_msg_bg_color: "rgb(251, 163, 80)", + chat_conv_bg_color: "rgb(251, 163, 80)", } let style_dark = { @@ -53,6 +55,8 @@ chat_other_color: "rgb( 90, 90, 90)", chat_other_bg_color: "rgb(210, 210, 210)", chat_serveur_color: "rgb(190, 190, 190)", + chat_msg_bg_color: "rgb( 82, 82, 82)", + chat_conv_bg_color: "rgb( 82, 82, 82)", } let style = style_light; @@ -102,6 +106,8 @@ --chat_other_color={style.chat_other_color} --chat_other_bg_color={style.chat_other_bg_color} --chat_serveur_color={style.chat_serveur_color} + --chat_msg_bg_color={style.chat_msg_bg_color} + --chat_conv_bg_color={style.chat_conv_bg_color} /> {/if} 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 ee95672d..caf1ef54 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 @@ -111,7 +111,7 @@ overflow-x: hidden; overflow-y: scroll; - background-color: var(--bg_color); + background-color: var(--chat_msg_bg_color); border: var(--lines_width) solid var(--lines_color); } .grid_box .text_area { @@ -132,6 +132,7 @@ .grid_box .panel_msg { flex-direction: column-reverse; border: var(--lines_width) solid var(--lines_color); + background-color: var(--chat_conv_bg_color); } .grid_box .msg_thread { width: 100%; 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 c0e6aac0..7223478f 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 @@ -9,15 +9,16 @@ export let back = ""; let users: User[] = get_room_users(); + let is_admin = false; get_is_admin().then(response => is_admin = response); to_print("current_room:", $current_room); - function user_profile(username: string) + function user_profile(room_user: string) { to_print("in user_profile"); - settings_user.set(username); + settings_user.set(room_user); layout.set("user"); } @@ -82,7 +83,7 @@

list of users is loading...

{:then users} {#each users as user} - + {/each} + {/await} 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 45e3f9cc..4afc34aa 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 @@ -11,9 +11,6 @@ export let back = ""; - let mute = "mute"; - let block = "block"; - let is_admin = false; get_is_admin().then(response => is_admin = response); @@ -23,30 +20,36 @@ function game_invitation() { to_print("in game_invitation"); - const username = $settings_user; + const username = $settings_user.name; invited_username.set(username); push("/game"); } function view_profile() { to_print("in view_profile"); + push(`/profile/users/${$settings_user.name}`); } async function block_user() { to_print("in block_user"); - await set_block_user($settings_user); + await set_block_user($settings_user.name); layout.set("room"); } async function unblock_user() { to_print("in unblock_user"); - await remove_block_user($settings_user); + await remove_block_user($settings_user.name); layout.set("room"); } + async function get_list_block_user() + { + to_print("in get_list_block_user"); + await list_block_user(); + } async function make_user_admin() { to_print("in make_user_admin"); - response = await make_admin($settings_user); + response = await make_admin($settings_user.name); //show errors if (response.status >= 300 || response.error) show_error = response.error; @@ -64,7 +67,7 @@ @@ -91,19 +94,22 @@ - - + {#if $settings_user.isblocked} + + {:else} + + {/if} {#if is_admin && back === "room_set" && $current_room.type !== "direct"} {/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 bfa5cc30..4bfdcfcb 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,6 +1,6 @@ import { msgs, user, layout, socket, current_room } from './Store_chat'; import type { Room, FetchResponse } from './Types_chat'; -import { FetchMethod, Mute } from './Types_chat'; +import { FetchMethod, Mute, User } from './Types_chat'; import { to_print } from './Utils_chat'; import { fetch_chat_request, set_client_name_on_room, fill_fetch_response } from './Request_utils'; @@ -27,9 +27,9 @@ export async function create_room(room: Room) { to_print("in create_room"); -to_print("room sent to create:", room); + to_print("room sent to create:", room); let response: FetchResponse = await fetch_chat_request('create', FetchMethod.POST, room); -to_print("room returned from create:", response.room); + to_print("room returned from create:", response.room); return response; } @@ -38,9 +38,9 @@ export async function join_room(room: Room) { to_print("in join_room"); -to_print("room sent to join:", room); + to_print("room sent to join:", room); let response: FetchResponse = await fetch_chat_request('join', FetchMethod.POST, room); -to_print("room returned from join:", response.room); + to_print("room returned from join:", response.room); return response.room; } @@ -49,9 +49,9 @@ export async function change_room(room: Room) { to_print("in change_room"); -to_print("room sent to change:", room); + to_print("room sent to change:", room); let response: FetchResponse = await fetch_chat_request('change', FetchMethod.POST, room); -to_print("room returned from change:", response.room); + to_print("room returned from change:", response.room); await get_room_messages(); @@ -65,9 +65,9 @@ export async function validate_password(room: Room) { to_print("in validate_password"); -to_print("room sent to validate password:", room); + to_print("room sent to validate password:", room); let response: FetchResponse = await fetch_chat_request('passwordauth', FetchMethod.POST, room); -to_print("room returned from validate password:", response.room); + to_print("room returned from validate password:", response.room); return response; } @@ -76,9 +76,9 @@ export async function add_password(room: Room) { to_print("in add_password"); -to_print("room sent to add password:", room); + to_print("room sent to add password:", room); let response: FetchResponse = await fetch_chat_request('addpassword', FetchMethod.POST, room); -to_print("room returned from add password:", response.room); + to_print("room returned from add password:", response.room); return response; } @@ -93,9 +93,9 @@ export async function change_password(room: Room, old_password: string) old_password: old_password, } -to_print("room sent to change password:", room); + to_print("room sent to change password:", room); let response: FetchResponse = await fetch_chat_request('changepassword', FetchMethod.POST, request_body); -to_print("room returned from change password:", response.room); + to_print("room returned from change password:", response.room); return response; } @@ -104,9 +104,9 @@ export async function remove_password(room: Room) { to_print("in send_password"); -to_print("room sent to remove password:", room); + to_print("room sent to remove password:", room); let response: FetchResponse = await fetch_chat_request('removepassword', FetchMethod.DELETE, room); -to_print("room returned from remove password:", response.room); + to_print("room returned from remove password:", response.room); return response; } @@ -140,11 +140,12 @@ export async function get_all_rooms() return response.rooms; } -export async function get_room_users() +export async function get_room_users(): Promise { to_print("in get_room_users"); let response: FetchResponse = await fetch_chat_request('roomusers', FetchMethod.GET); + to_print("response from get_room_users:", response); return response.users; } @@ -169,9 +170,9 @@ export async function make_admin(username): Promise { to_print("in is_admin"); -to_print("username sent to setadmin:", username); + to_print("username sent to setadmin:", username); let response: FetchResponse = await fetch_chat_request('setadmin', FetchMethod.POST, {username: username} ); -to_print("response from setadmin:", response); + to_print("response from setadmin:", response); return response; } @@ -181,9 +182,9 @@ export async function get_is_admin(): Promise to_print("in is_admin"); let response: FetchResponse = await fetch_chat_request('isadmin', FetchMethod.GET); -to_print("is_admin return:", response.is_admin); + to_print("is_admin return:", response.condition); - return response.is_admin; + return response.condition; } export async function set_mute(date_limit: Date, username: string, time: string): Promise @@ -200,9 +201,9 @@ export async function set_mute(date_limit: Date, username: string, time: string) time: time, } -to_print("setmute send body:", body); + to_print("setmute send body:", body); let response: FetchResponse = await fetch_chat_request('setmute', FetchMethod.POST, body ); -to_print("setmute return:", response); + to_print("setmute return:", response); return response; } @@ -212,7 +213,7 @@ export async function get_is_mute(username: string): Promise to_print("in get_is_mute"); let response: FetchResponse = await fetch_chat_request('ismute', FetchMethod.POST, {username: username} ); -to_print("ismute return:", response); + to_print("ismute return:", response); return response.mute; } @@ -238,3 +239,13 @@ export async function remove_block_user(username: string): Promise await fetch_chat_request('unblock', FetchMethod.POST, {username: username} ); } +export async function list_block_user(username: string): Promise +{ + to_print("in list_block_user"); + + let response = await fetch_chat_request('listblock', FetchMethod.GET); + to_print("response.users:", response.users); + + return response.users; +} + diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Store_chat.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Store_chat.ts index 9f055479..4a653e54 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Store_chat.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Store_chat.ts @@ -1,16 +1,12 @@ import { writable } from 'svelte/store'; -import type { Room, Message } from './Types_chat'; +import type { Room, Message, User } from './Types_chat'; -export let msgs = writable([]); -export let my_rooms = writable([]); -export let all_rooms = writable([]); +export let msgs = writable(); +export let my_rooms = writable(); +export let all_rooms = writable(); +export let current_room = writable(); +export let settings_user = writable(); export let layout = writable("close"); -export let current_room = writable({ - name: "", - type: "", - protection: false, -}); -export let settings_user = writable(""); export let user; export let socket; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts b/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts index 174a5516..a142fa64 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Types_chat.ts @@ -17,13 +17,14 @@ export interface Mute export interface Message { name: string; - type: string; + message: string; } export interface User { name: string; isadmin: boolean; + isblocked: boolean; } export interface FetchResponse @@ -36,7 +37,7 @@ export interface FetchResponse users?: User[]; room?: Room; rooms?: Room[]; - is_admin?: boolean; + condition?: boolean; mute?: Mute; }