From 2b16af1785dbf58cf5921415ae7255ef5090a453 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Tue, 13 Jun 2023 21:12:57 +0200 Subject: [PATCH 01/55] add 2fa and env var(not in conf files) --- .env | 37 ++- conf/nginx.conf | 6 +- containers/api/package-lock.json | 20 ++ containers/api/package.json | 1 + containers/api/src/app.controller.ts | 80 +++-- containers/api/src/auth/auth.module.ts | 2 +- containers/api/src/auth/auth.service.ts | 11 +- containers/api/src/auth/constants.ts | 3 +- containers/api/src/auth/login42.ts | 12 +- containers/api/src/config/config.service.ts | 12 +- containers/api/src/main.ts | 6 +- containers/api/src/model/user.entity.ts | 16 +- containers/api/src/users/2fa.ts | 309 ++++++++++++------ containers/chat/package-lock.json | 12 + containers/chat/package.json | 1 + containers/chat/src/main.ts | 6 +- containers/pong/package-lock.json | 12 + containers/pong/package.json | 1 + containers/pong/src/main.ts | 6 +- containers/pong/src/pong/pong.gateway.ts | 23 ++ containers/react/src/components/404.jsx | 21 ++ containers/react/src/components/App.jsx | 24 +- .../react/src/components/Game/PlayButton.js | 27 +- containers/react/src/components/Header.jsx | 8 +- .../react/src/components/Messages/Message.jsx | 2 +- .../src/components/Social/FriendRequest.jsx | 25 +- containers/react/src/pages/Field.js | 42 ++- containers/react/src/pages/canvas.js | 131 +++++++- containers/react/src/script/axiosApi.js | 2 +- docker-compose.yml | 14 +- 30 files changed, 668 insertions(+), 204 deletions(-) create mode 100644 containers/react/src/components/404.jsx diff --git a/.env b/.env index 5ded86e1..e81c3999 100644 --- a/.env +++ b/.env @@ -1,3 +1,8 @@ +#nessecarr var +#API_SECRET + + + # POSTGRES_USER=kinou # POSTGRES_PASSWORD=pass # POSTGRES_DB=postgreDB @@ -5,11 +10,35 @@ # POSTGRES_HOST=localhost # POSTGRES_HOST_AUTH_METHOD=trust -POSTGRES_HOST=127.0.0.1 -POSTGRES_PORT=5432 +#URL +NGINX_ENVSUBST_TEMPLATE_SUFFIX=".conf" + +BASE_URL=http://localhost + +#postgres var +# POSTGRES_HOST=127.0.0.1 +# DB_TYPE=postgres +POSTGRES_HOST=postgresql POSTGRES_USER=postgres POSTGRES_PASSWORD=pass POSTGRES_DATABASE=postgres -PORT=3000 MODE=DEV -RUN_MIGRATIONS=true \ No newline at end of file + +#port +API_PORT=3000 +# REACT_PORT=3000 (current = 8080) +NGINX_PORT=80 +PONG_PORT=4000 +CHAT_PORT=4001 +POSTGRES_PORT=5432 + +#???? +RUN_MIGRATIONS=true +REACT_HOST=0.0.0.0 + + +#auth var +JWT_SECRET=secrethere +REDIRECT_URI=http://localhost:80/api/auth/login +API_SECRET=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 +CLIENT_UID=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41 \ No newline at end of file diff --git a/conf/nginx.conf b/conf/nginx.conf index f4093a53..8af41775 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,15 +2,14 @@ server { # listen 443 ssl; # listen 80 ssl; # listen 443 ssl; - listen 80; - + # listen ${NGINX_PORT}; + listen 80; location /{ proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://react_app:8080; } @@ -19,7 +18,6 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://api:3000/api; } } \ No newline at end of file diff --git a/containers/api/package-lock.json b/containers/api/package-lock.json index e925e7b2..d6ede8ee 100644 --- a/containers/api/package-lock.json +++ b/containers/api/package-lock.json @@ -22,6 +22,7 @@ "express-session": "^1.17.3", "hi-base32": "^0.5.1", "nanoid": "^3.3.4", + "otpauth": "^9.1.2", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -6099,6 +6100,14 @@ "npm": ">=6" } }, + "node_modules/jssha": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.0.tgz", + "integrity": "sha512-w9OtT4ALL+fbbwG3gw7erAO0jvS5nfvrukGPMWIAoea359B26ALXGpzy4YJSp9yGnpUvuvOw1nSjSoHDfWSr1w==", + "engines": { + "node": "*" + } + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -6685,6 +6694,17 @@ "node": ">=0.10.0" } }, + "node_modules/otpauth": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/otpauth/-/otpauth-9.1.2.tgz", + "integrity": "sha512-iI5nlVvMFP3aTPdjG/fnC4mhVJ/KZOSnBrvo/VnYHUwlTp9jVLjAe2B3i3pyCH+3/E5jYQRSvuHk/8oas3870g==", + "dependencies": { + "jssha": "~3.3.0" + }, + "funding": { + "url": "https://github.com/hectorm/otpauth?sponsor=1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", diff --git a/containers/api/package.json b/containers/api/package.json index 74c414b2..d54f1be3 100644 --- a/containers/api/package.json +++ b/containers/api/package.json @@ -33,6 +33,7 @@ "express-session": "^1.17.3", "hi-base32": "^0.5.1", "nanoid": "^3.3.4", + "otpauth": "^9.1.2", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index 489c3ad8..e652ec46 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -9,7 +9,15 @@ import { UsersService } from './users/users.service'; import { MatchLog } from './model/user.entity' import { generate } from 'rxjs'; -import { generateQRcode } from './users/2fa'; + +// import { generateQRcode } from './users/2fa'; +import { generateOTP } from './users/2fa'; +import { VerifyOTP } from './users/2fa'; +import { ValidateOTP } from './users/2fa'; + + +//2fa + // import { initStorage, getUser, setUser } from './storage'; @@ -216,20 +224,30 @@ export class AppController { //======================================================================================================== //======================================================================================================== +// import { Prisma } from "@prisma/client"; +// import { Request, Response, NextFunction } from "express"; +// import { prisma } from "../server"; + + + @Redirect('http://localhost/token', 302) @Get('auth/login') async login2(@Req() request: Request) { const url = request.url; const user = await this.loginClass.Login42(url); console.log(`user in auth/login= ${user}`); - const data = this.authService.login(user); + console.log(`user in auth/login= ${user.username}`); + const data = await this.authService.login(user); console.log(`all data in api = ${data}`) const myJSON = JSON.stringify(data); console.log(`all data json version= ${myJSON}`) console.log(`data in api = ${(await data).access_token}`) + // console.log(`data i = ${(await data).access_token}`) const token = (await data).access_token; + // console + await this.userService.save(user); return { url: `http://localhost/token?data=${encodeURIComponent(JSON.stringify(token))}` }; } @@ -238,17 +256,49 @@ export class AppController { async get2fa(@Request() req) { const user = await this.userService.findOne(req.user.username); - return user.doubleAuth; + return user.otp_enabled; } @UseGuards(JwtAuthGuard) - @Get('/QRcode') - async createQrCode(@Request() req) + @Post('/otp') + async createOTP(@Request() req) { - return (await generateQRcode(req)); + const user = await this.userService.findOne(req.user.username); + // const user2 = await this.userService.findOne(req.user.username); + const res = await generateOTP(user); + await this.userService.save(user); + // console.log(user); + return res; } + @UseGuards(JwtAuthGuard) + @Post('/verifyOtp') + async verifyOTP(@Request() req, @Body() data: any) + { + const user = await this.userService.findOne(req.user.username); + const res = await VerifyOTP(user, data.token) + await this.userService.save(user); + return res + } + + @UseGuards(JwtAuthGuard) + @Post('/validateOtp') + async validateOTP(@Request() req, @Body() data: any) + { + const user = await this.userService.findOne(req.user.username); + const res = await ValidateOTP(user, data.token) + // await this.userService.save(user); + return res + } + +// @UseGuards(JwtAuthGuard) +// @Get('/QRcode') +// async createQrCode(@Request() req) +// { +// return (await generateQRcode(req)); +// } + @UseGuards(JwtAuthGuard) @Post('/quit') async setOffline(@Request() req) { @@ -271,6 +321,8 @@ export class AppController { async createConv(@Request() req, @Body() data: any) { ///create conv and return it ? id? console.log(`data post /conv= ${data}`); + console.log(`data post /conv= ${data.members}`); + console.log(`data post /conv= ${data.name}`); // let test = {id: 2, members: "cc"}; return await this.chatService.createConv(data); // res.json(messages); @@ -278,20 +330,10 @@ export class AppController { -// @UseGuards(JwtAuthGuard) + @UseGuards(JwtAuthGuard) @Get('/conv') - async getConv(@Request() req, @Body() data: any) { - ///create conv and return it ? id? - // console.log(`data get /conv= ${data}`); - // let test = {id: 2, members: "cc"}; - - // let tab = [data.member, "test"]; - // console.log(`tab= ${tab}`); - return await this.chatService.getConv(data.member); - // return await this.chatService.getConv(req.user.username); - - - // res.json(messages); + async getConv(@Request() req) { + return await this.chatService.getConv(req.user.username); } // @UseGuards(JwtAuthGuard) diff --git a/containers/api/src/auth/auth.module.ts b/containers/api/src/auth/auth.module.ts index 68f7047e..7d5b4695 100644 --- a/containers/api/src/auth/auth.module.ts +++ b/containers/api/src/auth/auth.module.ts @@ -28,7 +28,7 @@ import { JwtStrategy } from './jwt.strategy'; PassportModule, JwtModule.register({ secret: jwtConstants.secret, - signOptions: { expiresIn: '60000s' }, + // signOptions: { expiresIn: '60000s' }, }), ], providers: [AuthService, LocalStrategy, JwtStrategy], diff --git a/containers/api/src/auth/auth.service.ts b/containers/api/src/auth/auth.service.ts index db08d5b2..8f0a2455 100644 --- a/containers/api/src/auth/auth.service.ts +++ b/containers/api/src/auth/auth.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { UsersService } from '../users/users.service'; import { JwtService } from '@nestjs/jwt'; +import { User } from 'src/model/user.entity'; @Injectable() export class AuthService { @@ -19,13 +20,13 @@ export class AuthService { return null; } - async login(user) { - const myJSON = JSON.stringify(user); + async login(user: User) { + // const myJSON = JSON.stringify(user); // console.log(`in login all user= ${myJSON}`) - // console.log(`in login user= ${user.username}`) + console.log(`in login user= ${user.username}`) const payload = { username: user.username, sub: user.userId }; - // console.log(`in login payload name= ${payload.username}`) - // console.log(`in login payload sub= ${payload.sub}`) + console.log(`in login payload name= ${payload.username}`) + console.log(`in login payload sub= ${payload.sub}`) return { access_token: this.jwtService.sign(payload), }; diff --git a/containers/api/src/auth/constants.ts b/containers/api/src/auth/constants.ts index efce4f67..4ab5a56d 100644 --- a/containers/api/src/auth/constants.ts +++ b/containers/api/src/auth/constants.ts @@ -1,3 +1,4 @@ export const jwtConstants = { - secret: 'DO NOT USE THIS VALUE. INSTEAD, CREATE A COMPLEX SECRET AND KEEP IT SAFE OUTSIDE OF THE SOURCE CODE.', + // secret: 'DO NOT USE THIS VALUE. INSTEAD, CREATE A COMPLEX SECRET AND KEEP IT SAFE OUTSIDE OF THE SOURCE CODE.', + secret: process.env.JWT_SECRET, }; \ No newline at end of file diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index 4d0adea4..929afb39 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -24,10 +24,11 @@ export class loginClass { const data = { grant_type: 'authorization_code', - client_id: 'u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41', - client_secret: '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', + client_id: process.env.CLIENT_UID || 'u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41', + // client_secret: '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', + client_secret: process.env.API_SECRET, code: code, - redirect_uri: 'http://localhost:80/api/auth/login', + redirect_uri: process.env.REDIRECT_URI || 'http://localhost:80/api/auth/login', }; try { @@ -64,9 +65,12 @@ export class loginClass { loss: 0, rank: 1200, userId: userId, + otp_base32: null, children: null, status: 1, - doubleAuth: 0, + // doubleAuth: 0, + otp_enabled: false, + otp_verified: false, friendRequest: null, friends: null, photo: null, diff --git a/containers/api/src/config/config.service.ts b/containers/api/src/config/config.service.ts index cd1ded6f..efb443aa 100644 --- a/containers/api/src/config/config.service.ts +++ b/containers/api/src/config/config.service.ts @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/09 14:53:49 by apommier #+# #+# */ -/* Updated: 2023/06/01 13:07:12 by apommier ### ########.fr */ +/* Updated: 2023/06/12 14:51:44 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,11 +14,11 @@ import { TypeOrmModuleOptions } from '@nestjs/typeorm'; export const getTypeOrmConfig = (): TypeOrmModuleOptions => ({ type: 'postgres', - host: 'postgresql', - port: 5432, - username: 'postgres', - password: 'pass', - database: 'postgres', + host: process.env.POSTGRES_HOST || 'postgresql', + port: parseInt(process.env.POSTGRES_PORT, 10) || 5432, + username: process.env.POSTGRES_USER || 'postgres', + password: process.env.POSTGRES_PASSWORD || 'pass', + database: process.env.POSTGRES_DATABASE || 'postgres', entities: ["dist/**/*.entity.js"], // entities: [join(__dirname, '**', '*.entity.{ts,js}')] // entities: ['**/*.entity{.ts,.js}'], //basic diff --git a/containers/api/src/main.ts b/containers/api/src/main.ts index c3a0187d..aafa4d84 100644 --- a/containers/api/src/main.ts +++ b/containers/api/src/main.ts @@ -1,6 +1,10 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import * as session from 'express-session'; +import * as dotenv from 'dotenv'; + +dotenv.config(); +console.log(process.env); // async function bootstrap() { // const app = await NestFactory.create(AppModule); @@ -27,6 +31,6 @@ async function bootstrap() { saveUninitialized: false, }), ); - await app.listen(3000); + await app.listen(parseInt(process.env.API_PORT) || 3000); } bootstrap(); \ No newline at end of file diff --git a/containers/api/src/model/user.entity.ts b/containers/api/src/model/user.entity.ts index c0413098..1928c9fa 100644 --- a/containers/api/src/model/user.entity.ts +++ b/containers/api/src/model/user.entity.ts @@ -20,6 +20,18 @@ export class User { @PrimaryGeneratedColumn() id: number; + // otp_enabled Boolean @default(false) + // otp_verified Boolean @default(false) + + @Column({ default: false }) + otp_enabled: boolean; + + @Column({ default: false }) + otp_verified: boolean; + + @Column({ nullable: true }) + otp_base32: string; + @Column({ nullable: true }) nickname: string; @@ -47,8 +59,8 @@ export class User { @Column({ default: 0 }) userId: number; - @Column({ default: 0 }) - doubleAuth: number; + // @Column({ default: 0 }) + // doubleAuth: number; @Column('text', { array: true, nullable: true }) friendRequest: string[]; diff --git a/containers/api/src/users/2fa.ts b/containers/api/src/users/2fa.ts index 2f1a3147..8e505cfd 100644 --- a/containers/api/src/users/2fa.ts +++ b/containers/api/src/users/2fa.ts @@ -1,6 +1,109 @@ -import crypto from 'crypto'; +// import crypto from 'crypto'; import base32Decode from 'base32-decode'; +import crypto from "crypto"; +import * as OTPAuth from "otpauth"; +import { encode } from "hi-base32"; + +// [...] Register user + +// [...] Login user + +// [...] Generate OTP + +const generateRandomBase32 = async () => { + const {randomBytes} = await import('crypto'); + const buffer = randomBytes(15); + const base32 = encode(buffer).replace(/=/g, "").substring(0, 24); + return base32; + }; + +export const generateOTP = async (user) => { + try { + const base32_secret = await generateRandomBase32(); + + let totp = new OTPAuth.TOTP({ + issuer: "Localhost", + label: "OnlinePong", + algorithm: "SHA1", + digits: 6, + period: 15, + secret: base32_secret, + }); + + let otpauth_url = totp.toString(); + + const res = { + otpauth_url: otpauth_url, + base32_secret: base32_secret + } + + console.log("res= ", res) + + //update db with otp var + user.otp_enabled = true; + user.otp_base32 = base32_secret; + return (res) + + } catch (error) { + console.log(error) + } + }; + + export const VerifyOTP = async (user, token: string) => { + try { + let totp = new OTPAuth.TOTP({ + issuer: "Localhost", + label: "OnlinePong", + algorithm: "SHA1", + digits: 6, + period: 15, + secret: user.otp_base32, + }); + + let delta = totp.validate({ token }); + + if (delta === null) { + console.log("error verify token") + return ("error verify token") + } + else + { + user.otp_verified = true; + console.log("token verified") + } + } catch (error) { + console.log(error) + } + }; + + export const ValidateOTP = async (user, token: string) => { + try { + let totp = new OTPAuth.TOTP({ + issuer: "Localhost", + label: "OnlinePong", + algorithm: "SHA1", + digits: 6, + period: 15, + secret: user.otp_base32, + }); + + let delta = totp.validate({ token }); + + if (delta === null) { + console.log("error validate token") + return ("error validate token") + } + else + { + // user.otp_verified = true; + console.log("token validated") + } + } catch (error) { + console.log(error) + } + }; + // import { randomBytes} from 'crypto'; // import { promisify } from 'util'; @@ -33,48 +136,48 @@ import base32Decode from 'base32-decode'; // type QRcode = any; -export function generateHOTP(secret, counter) { - const decodedSecret = base32Decode(secret, 'RFC4648'); +// export function generateHOTP(secret, counter) { +// const decodedSecret = base32Decode(secret, 'RFC4648'); - const buffer = Buffer.alloc(8); - for (let i = 0; i < 8; i++) { - buffer[7 - i] = counter & 0xff; - counter = counter >> 8; - } - - // Step 1: Generate an HMAC-SHA-1 value - const hmac = crypto.createHmac('sha1', Buffer.from(decodedSecret)); - hmac.update(buffer); - const hmacResult = hmac.digest(); - - // Step 2: Generate a 4-byte string (Dynamic Truncation) - const offset = hmacResult[hmacResult.length - 1] & 0xf; - const code = - ((hmacResult[offset] & 0x7f) << 24) | - ((hmacResult[offset + 1] & 0xff) << 16) | - ((hmacResult[offset + 2] & 0xff) << 8) | - (hmacResult[offset + 3] & 0xff); - - // Step 3: Compute an HOTP value - return code % 10 ** 6; - } +// const buffer = Buffer.alloc(8); +// for (let i = 0; i < 8; i++) { +// buffer[7 - i] = counter & 0xff; +// counter = counter >> 8; +// } -export function generateTOTP(secret, window = 0) -{ - const counter = Math.floor(Date.now() / 30000); - return generateHOTP(secret, counter + window); -} +// // Step 1: Generate an HMAC-SHA-1 value +// const hmac = crypto.createHmac('sha1', Buffer.from(decodedSecret)); +// hmac.update(buffer); +// const hmacResult = hmac.digest(); -export function verifyTOTP(token, secret, window = 1) -{ - for (let errorWindow = -window; errorWindow <= +window; errorWindow++) - { - const totp = generateTOTP(secret, errorWindow); - if (token === totp) - return true; - } - return false; -} +// // Step 2: Generate a 4-byte string (Dynamic Truncation) +// const offset = hmacResult[hmacResult.length - 1] & 0xf; +// const code = +// ((hmacResult[offset] & 0x7f) << 24) | +// ((hmacResult[offset + 1] & 0xff) << 16) | +// ((hmacResult[offset + 2] & 0xff) << 8) | +// (hmacResult[offset + 3] & 0xff); + +// // Step 3: Compute an HOTP value +// return code % 10 ** 6; +// } + +// export function generateTOTP(secret, window = 0) +// { +// const counter = Math.floor(Date.now() / 30000); +// return generateHOTP(secret, counter + window); +// } + +// export function verifyTOTP(token, secret, window = 1) +// { +// for (let errorWindow = -window; errorWindow <= +window; errorWindow++) +// { +// const totp = generateTOTP(secret, errorWindow); +// if (token === totp) +// return true; +// } +// return false; +// } @@ -94,86 +197,86 @@ export function verifyTOTP(token, secret, window = 1) // import * as base32Encode from 'base32-encode'; // import { base32Encode } from 'base32-encode'; // import base32Encode from 'base32-encode'; -import { encode } from 'thirty-two'; +// import { encode } from 'thirty-two'; -// ... +// // ... -import * as qrcode from 'qrcode'; -import * as fs from 'fs'; +// import * as qrcode from 'qrcode'; +// import * as fs from 'fs'; -import { nanoid } from "nanoid"; -// import * as nanoid from 'nanoid' +// import { nanoid } from "nanoid"; +// // import * as nanoid from 'nanoid' -export async function generateQRcode(req) -{ - // const base32Encode = (await import('base32-encode')); - // const nanoid = (await import('nanoid')); +// export async function generateQRcode(req) +// { +// // const base32Encode = (await import('base32-encode')); +// // const nanoid = (await import('nanoid')); - // const util = (await import('util')); - // const qrcode = (await import('qrcode')); +// // const util = (await import('util')); +// // const qrcode = (await import('qrcode')); - const user = req.user; - let res; - // For security, we no longer show the QR code after is verified - // if (user.mfaEnabled) return res.status(404).end(); +// const user = req.user; +// let res; +// // For security, we no longer show the QR code after is verified +// // if (user.mfaEnabled) return res.status(404).end(); - // if (!user.mfaSecret) { //to do - const buffer = nanoid(14); - // generate unique secret for user - // this secret will be used to check the verification code sent by user - // const buffer = await util.promisify(crypto.randomBytes)(14); - // const buffer = crypto.lib.WordArray.random(32) - user.mfaSecret = encode(buffer).toString('utf8'); - // user.mfaSecret = base32Encoded(buffer, 'RFC4648', { padding: false }); +// // if (!user.mfaSecret) { //to do +// const buffer = nanoid(14); +// // generate unique secret for user +// // this secret will be used to check the verification code sent by user +// // const buffer = await util.promisify(crypto.randomBytes)(14); +// // const buffer = crypto.lib.WordArray.random(32) +// user.mfaSecret = encode(buffer).toString('utf8'); +// // user.mfaSecret = base32Encoded(buffer, 'RFC4648', { padding: false }); - // setUser(user); // to do !! +// // setUser(user); // to do !! - // } +// // } - const issuer = 'Google'; - const algorithm = 'SHA1'; - const digits = '6'; - const period = '30'; - const otpType = 'totp'; - const configUri = `otpauth://${otpType}/${issuer}:${user.username}?algorithm=${algorithm}&digits=${digits}&period=${period}&issuer=${issuer}&secret=${user.mfaSecret}`; +// const issuer = 'Google'; +// const algorithm = 'SHA1'; +// const digits = '6'; +// const period = '30'; +// const otpType = 'totp'; +// const configUri = `otpauth://${otpType}/${issuer}:${user.username}?algorithm=${algorithm}&digits=${digits}&period=${period}&issuer=${issuer}&secret=${user.mfaSecret}`; - // res.setHeader('Content-Type', 'image/png'); - const QRCode = require('qrcode'); - console.log(`before done`); - // QRCode.toFileStream(res, configUri); - // const filePath = 'qrcode.png'; // Specify the file path where the QR code should be saved +// // res.setHeader('Content-Type', 'image/png'); +// const QRCode = require('qrcode'); +// console.log(`before done`); +// // QRCode.toFileStream(res, configUri); +// // const filePath = 'qrcode.png'; // Specify the file path where the QR code should be saved - const qrCodeData = buffer; // Replace with your actual QR code data - const filePath = 'qrcode.png'; // Specify the file path where the QR code should be saved +// const qrCodeData = buffer; // Replace with your actual QR code data +// const filePath = 'qrcode.png'; // Specify the file path where the QR code should be saved - qrcode.toFile(filePath, qrCodeData, (error) => { - if (error) { - console.error(error); - // Handle the error appropriately - return; - } - // QR code image has been generated and saved to the file - // Or, you can create a buffer of the image data directly - }) +// qrcode.toFile(filePath, qrCodeData, (error) => { +// if (error) { +// console.error(error); +// // Handle the error appropriately +// return; +// } +// // QR code image has been generated and saved to the file +// // Or, you can create a buffer of the image data directly +// }) -// qrcode.toFile(filePath, configUri, (error) => { -// if (error) { -// console.error(error); -// // Handle the error appropriately -// return; -// } -// const readableStream = fs.createReadStream(filePath); -// res.data = readableStream; - // Use the readable stream as needed -// }); +// // qrcode.toFile(filePath, configUri, (error) => { +// // if (error) { +// // console.error(error); +// // // Handle the error appropriately +// // return; +// // } +// // const readableStream = fs.createReadStream(filePath); +// // res.data = readableStream; +// // Use the readable stream as needed +// // }); - // qrcode.toFileStream(res, configUri); - console.log(`QRcode done`); - return res; - // return - } \ No newline at end of file +// // qrcode.toFileStream(res, configUri); +// console.log(`QRcode done`); +// return res; +// // return +// } \ No newline at end of file diff --git a/containers/chat/package-lock.json b/containers/chat/package-lock.json index 914abd4d..02a0936d 100644 --- a/containers/chat/package-lock.json +++ b/containers/chat/package-lock.json @@ -15,6 +15,7 @@ "@nestjs/platform-socket.io": "^9.4.0", "@nestjs/websockets": "^9.4.0", "cors": "^2.8.5", + "dotenv": "^16.1.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "socket.io-client": "^4.6.1", @@ -3398,6 +3399,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/containers/chat/package.json b/containers/chat/package.json index ccf405b6..e1c3403c 100644 --- a/containers/chat/package.json +++ b/containers/chat/package.json @@ -26,6 +26,7 @@ "@nestjs/platform-socket.io": "^9.4.0", "@nestjs/websockets": "^9.4.0", "cors": "^2.8.5", + "dotenv": "^16.1.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "socket.io-client": "^4.6.1", diff --git a/containers/chat/src/main.ts b/containers/chat/src/main.ts index c964f081..b81c8ba7 100644 --- a/containers/chat/src/main.ts +++ b/containers/chat/src/main.ts @@ -3,6 +3,10 @@ import { AppModule } from './app.module'; import * as cors from 'cors'; import { Server } from 'socket.io'; import * as socketio from 'socket.io'; +import * as dotenv from 'dotenv'; + +dotenv.config(); +console.log(process.env); async function bootstrap() { const app = await NestFactory.create(AppModule, { @@ -36,7 +40,7 @@ async function bootstrap() { }); }); - await app.listen(4001); + await app.listen(parseInt(process.env.CHAT_PORT) || 4001); } bootstrap(); diff --git a/containers/pong/package-lock.json b/containers/pong/package-lock.json index 914abd4d..02a0936d 100644 --- a/containers/pong/package-lock.json +++ b/containers/pong/package-lock.json @@ -15,6 +15,7 @@ "@nestjs/platform-socket.io": "^9.4.0", "@nestjs/websockets": "^9.4.0", "cors": "^2.8.5", + "dotenv": "^16.1.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "socket.io-client": "^4.6.1", @@ -3398,6 +3399,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/containers/pong/package.json b/containers/pong/package.json index ccf405b6..e1c3403c 100644 --- a/containers/pong/package.json +++ b/containers/pong/package.json @@ -26,6 +26,7 @@ "@nestjs/platform-socket.io": "^9.4.0", "@nestjs/websockets": "^9.4.0", "cors": "^2.8.5", + "dotenv": "^16.1.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0", "socket.io-client": "^4.6.1", diff --git a/containers/pong/src/main.ts b/containers/pong/src/main.ts index 7d85a5af..676fb1ff 100644 --- a/containers/pong/src/main.ts +++ b/containers/pong/src/main.ts @@ -21,6 +21,10 @@ import { AppModule } from './app.module'; import * as cors from 'cors'; import { Server } from 'socket.io'; import * as socketio from 'socket.io'; +import * as dotenv from 'dotenv'; + +dotenv.config(); +console.log(process.env); async function bootstrap() { const app = await NestFactory.create(AppModule, { @@ -54,7 +58,7 @@ async function bootstrap() { }); }); - await app.listen(4000); + await app.listen(process.env.PONG_PORT || 4000); } bootstrap(); \ No newline at end of file diff --git a/containers/pong/src/pong/pong.gateway.ts b/containers/pong/src/pong/pong.gateway.ts index 19b81f12..de0e259b 100644 --- a/containers/pong/src/pong/pong.gateway.ts +++ b/containers/pong/src/pong/pong.gateway.ts @@ -68,11 +68,19 @@ export class PongGateway implements OnGatewayInit, OnGatewayConnection, OnGatewa // } // // console.log(`from: ${client.id}`); // } + @SubscribeMessage('pong:invite') + createPrivateGame(client: Socket, payload: any): void { + //after invite accepted ? + //set the two user in a game ? + + } + @SubscribeMessage('pong:matchmaking') addMatchmaking(client: Socket, payload: any): void { console.log("matchmaking"); console.log(payload); + console.log(`option= ${payload.option}`); // Add the client to the waitingClients set along with their chosen option this.waitingClients.add({ client, option: payload.option }); console.log("Adding client to waiting list..."); @@ -147,6 +155,21 @@ addMatchmaking(client: Socket, payload: any): void { // console.log("END OF HANDLE"); // } + @SubscribeMessage('pong:power') + sendPower(client: Socket, payload: any): void + { + console.log(`from: ${client.id}`); + console.log(payload); + + const game = this.games.get(payload.gameId); + const playersIds = game.map(socket => socket.id); + if (playersIds[0] === payload.id) + this.clients[playersIds[1]].emit('pong:power', payload); + else if (playersIds[1] === payload.id) + this.clients[playersIds[0]].emit('pong:power', payload); + console.log("END OF HANDLE"); + } + @SubscribeMessage('pong:message') handleMessage(client: Socket, payload: any): void { diff --git a/containers/react/src/components/404.jsx b/containers/react/src/components/404.jsx new file mode 100644 index 00000000..ac563d3d --- /dev/null +++ b/containers/react/src/components/404.jsx @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 404.jsx :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/09 23:07:12 by apommier #+# #+# */ +/* Updated: 2023/06/12 17:09:11 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +function PageNotFound() { + return ( +
+

404 Page not found

+
+ ); +} + +export default PageNotFound \ No newline at end of file diff --git a/containers/react/src/components/App.jsx b/containers/react/src/components/App.jsx index 204d2a28..27d570b3 100644 --- a/containers/react/src/components/App.jsx +++ b/containers/react/src/components/App.jsx @@ -1,5 +1,5 @@ import React from "react"; -import {Routes, Route} from 'react-router-dom'; +import {Routes, Route, Navigate} from 'react-router-dom'; import HomeLogin from "../pages/Home.js"; import Home from "../pages/Home.jsx"; @@ -17,15 +17,32 @@ import SuccessToken from '../script/tokenSuccess' import DoubleAuth from "../pages/2fa.js"; import Game from "../pages/Game.jsx"; import Social from "../components/Social/Social.jsx"; +import PageNotFound from "../components/404.jsx"; import Logout from "../components/Profile/Logout.jsx"; function AnimatedRoute () { const location = useLocation(); + if (!localStorage.getItem('token')) + { + return ( + + + }/> + }/> + + } /> + } /> + + + ) + } + return ( - }/> + {/* }/> */} + }/> }/> }/> @@ -41,6 +58,9 @@ function AnimatedRoute () { }/> }/> }/> + + } /> + } /> ) diff --git a/containers/react/src/components/Game/PlayButton.js b/containers/react/src/components/Game/PlayButton.js index 041af86e..04576ec7 100644 --- a/containers/react/src/components/Game/PlayButton.js +++ b/containers/react/src/components/Game/PlayButton.js @@ -6,10 +6,33 @@ function PlayButton() { const history = useNavigate(); + // const handleButtonClick = () => { + // let path = `play`; + // history(path); + // }; const handleButtonClick = () => { - let path = `play`; + let path = `play?`; + + const superpowerCheckbox = document.querySelector('input[value="superpower"]'); + if (superpowerCheckbox.checked) { + path += 'superpower=true&'; + } + + const obstacleCheckbox = document.querySelector('input[value="obstacle"]'); + if (obstacleCheckbox.checked) { + path += 'obstacle=true&'; + } + + const speedCheckbox = document.querySelector('input[value="speed"]'); + if (speedCheckbox.checked) { + path += 'speed=true&'; + } + + // Remove the trailing '&' character + path = path.slice(0, -1); + console.log(path) history(path); - }; + }; return (
diff --git a/containers/react/src/components/Header.jsx b/containers/react/src/components/Header.jsx index 15c06b7d..484d2756 100644 --- a/containers/react/src/components/Header.jsx +++ b/containers/react/src/components/Header.jsx @@ -1,13 +1,9 @@ import React, {useState, useEffect} from 'react'; import {AiOutlineMenuUnfold} from 'react-icons/ai'; -// import * as AiIcons from 'react-icons/ai'; import {Link} from 'react-router-dom'; -// import { SidebarData } from './Sidebar/SidebarData'; import DefaultPicture from '../assets/profile.jpg' import { motion, AnimatePresence } from 'framer-motion' import Modal from './Sidebar/Modal'; -// import {BiLogOutCircle} from 'react-icons/bi'; -// import AnimatePresence from import '../styles/Header.css'; import api from '../script/axiosApi'; @@ -32,8 +28,8 @@ function Header() { console.error('Error fetching profile picture:', error); } }; - - fetchProfilePicture(); + if (localStorage.getItem('token')) + fetchProfilePicture(); }, []); // console.log(`profile pic= ${profilePicture}`) diff --git a/containers/react/src/components/Messages/Message.jsx b/containers/react/src/components/Messages/Message.jsx index cd10f4e1..e3c8a9ad 100644 --- a/containers/react/src/components/Messages/Message.jsx +++ b/containers/react/src/components/Messages/Message.jsx @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/01 18:24:46 by apommier #+# #+# */ -/* Updated: 2023/06/09 09:00:06 by apommier ### ########.fr */ +/* Updated: 2023/06/12 17:05:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/containers/react/src/components/Social/FriendRequest.jsx b/containers/react/src/components/Social/FriendRequest.jsx index bc828167..29020c86 100644 --- a/containers/react/src/components/Social/FriendRequest.jsx +++ b/containers/react/src/components/Social/FriendRequest.jsx @@ -46,28 +46,7 @@ export default function Friend({currentUser}) }; fetchProfilePicture(); - }) - - function getStatus(friend) - { - let status = friend.status - console.log(`status= ${status}`) - let statusColor; - - if (status === 0) - statusColor = 'grey'; - else if (status === 1) - statusColor = 'green'; - else if (status === 2) - statusColor = 'blue'; - return statusColor; - } - - const handleSpectate = (user) => { - //socket connection and add to party with one with username - console.log(`spectate hehe`) - console.log(`user= ${user}`) - }; + }, []) const handleButtonClick = (user) => { let path = `http://localhost/profile/${user.username}`; @@ -79,10 +58,12 @@ export default function Friend({currentUser}) const Accept = (user) => { console.log("accept") + console.log(`request = ${request}`) } const Refuse = (user) => { console.log("refuse") + console.log(`request = ${request}`) } return ( diff --git a/containers/react/src/pages/Field.js b/containers/react/src/pages/Field.js index c937b880..d299145e 100644 --- a/containers/react/src/pages/Field.js +++ b/containers/react/src/pages/Field.js @@ -1,13 +1,48 @@ -import { useEffect } from 'react'; +import { useEffect, useLocation } from 'react'; // import { useState, useRef } from 'react'; -import { drawCanvas } from './canvas.js'; +import DrawCanvas from './canvas.js'; +import queryString from 'query-string'; import '../styles/field.css'; +import { useParams } from "react-router-dom"; + +// import { withRouter } from 'react-router-dom'; + function Field() { useEffect(() => { + // const location = useLocation(); + const queryParams = queryString.parse(window.location.search); + console.log("launch canva hehe") - drawCanvas(); + let Modifiers = 0; + + if (queryParams.superpower === 'true') { + Modifiers += 1; + } + + if (queryParams.obstacle === 'true') { + Modifiers += 2; + } + + if (queryParams.speed === 'true') { + Modifiers += 4; + } + // console.log(`modifiers= ${Modifiers}`) + // DrawCanvas(Modifiers); + // return () => { + // console.log("000000000000000000000000000000000") + // // socketRef.current.disconnect(); + // }; + + // console.log(`modifiers= ${Modifiers}`) + const cleanup = DrawCanvas(Modifiers); + + return () => { + console.log("Cleanup"); + cleanup(); // Call the cleanup function to stop the ongoing process or perform necessary cleanup tasks + }; + }, []); // const [buttonClicked, setButtonClicked] = useState(false); @@ -28,6 +63,7 @@ function Field() } export default Field; +// export default withRouter(Field); // function Field() { diff --git a/containers/react/src/pages/canvas.js b/containers/react/src/pages/canvas.js index ec45cf8c..ae4785ff 100644 --- a/containers/react/src/pages/canvas.js +++ b/containers/react/src/pages/canvas.js @@ -2,19 +2,44 @@ import api from '../script/axiosApi'; -// import { useEffect } from 'react'; +// import { useEffect, useRef } from 'react'; import io from 'socket.io-client'; // const socket = io('http://192.168.1.14:4000'); // const socket = io('http://86.209.110.20:4000'); // const socket = io('http://172.29.113.91:4000'); -export function drawCanvas() { +function DrawCanvas(option) { + + + + console.log(`option= ${option}`); + const superpowerModifier = option & 1; // Retrieves the superpower modifier + const obstacleModifier = (option >> 1) & 1; // Retrieves the obstacle modifier + const speedModifier = (option >> 2) & 1; // Retrieves the speed modifier + + console.log(`superpowerModifier = ${superpowerModifier}`); + console.log(`obstacleModifier = ${obstacleModifier}`); + console.log(`speedModifier = ${speedModifier}`); + + + + // const socketRef = useRef(null); + // socketRef.current = io('http://localhost:4000'); const socket = io('http://localhost:4000'); - // const socket = io() + // const socket = socketRef.current console.log("start function"); const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); + // useEffect(() => { + // console.log("useeffect?????????????????") + // return () => { + // console.log("000000000000000000000000000000000") + // socketRef.current.disconnect(); + // }; + // }, []); + + //======================================================================================================== //======================================================================================================== // Var Declaration @@ -28,6 +53,7 @@ export function drawCanvas() { let opRank; //general canvas + let running = true; const scale = window.devicePixelRatio; canvas.width = canvas.offsetWidth; // canvas.height = canvas.width * 0.7 @@ -39,8 +65,9 @@ export function drawCanvas() { let paddleY = canvas.height / 2 - (paddleHeight / 2); let paddleX = canvas.width / 40; let paddleSpeed = canvas.height / 40; - + //opponent var + let opPaddleHeight = canvas.height * 0.25; let oPaddleY = paddleY; //mouse and touch @@ -81,6 +108,7 @@ export function drawCanvas() { console.log(`id ion matcj= ${myId}`) const info = { id: myId, + option: option, }; socket.emit('pong:matchmaking', info); } @@ -165,6 +193,27 @@ export function drawCanvas() { vY = data.vY; }); + + socket.on('pong:paddle', (data) => { + console.log("paddle info receive") + oPaddleY = (data.paddleY / data.height) * canvas.height + }); + + socket.on('pong:power', (data) => { + console.log("paddle info receive") + + oPaddleY = 0; + opPaddleHeight = canvas.height; + + setTimeout(() => { + // code à exécuter après 5 secondes + opPaddleHeight = canvas.height * 0.25; + oPaddleY = canvas.height / 2 - paddleHeight / 2; + console.log('Cinq secondes se sont écoulées.'); + }, 5000); + // oPaddleY = (data.paddleY / data.height) * canvas.height + }); + function send_info() { if (gameId === 0) @@ -183,11 +232,6 @@ export function drawCanvas() { socket.emit('pong:message', info); } - socket.on('pong:paddle', (data) => { - console.log("paddle info receive") - oPaddleY = (data.paddleY / data.height) * canvas.height - }); - function send_point() { if (gameId === 0) @@ -229,6 +273,17 @@ export function drawCanvas() { socket.emit('pong:paddle', info); } + function use_power() + { + const info = { + gameId: gameId, + width: canvas.width, + height: canvas.height, + id: myId, + } + socket.emit('pong:power', info); + } + function send_forced_info() { if (gameId === 0) @@ -275,7 +330,7 @@ export function drawCanvas() { function drawPaddle() { ctx.fillStyle = 'white'; ctx.fillRect(paddleX, paddleY, paddleWidth, paddleHeight); - ctx.fillRect(canvas.width - paddleX - paddleWidth, oPaddleY, paddleWidth, paddleHeight); + ctx.fillRect(canvas.width - paddleX - paddleWidth, oPaddleY, paddleWidth, opPaddleHeight); } function drawball() @@ -287,7 +342,7 @@ export function drawCanvas() { ctx.fill(); } - + //======================================================================================================== //======================================================================================================== // Loop @@ -298,9 +353,18 @@ matchmaking(); // while (!gameId) // ; + // Define a function to stop the drawing process + const stopDrawCanvas = () => { + running = false; + // Perform any necessary cleanup tasks + // ... + }; function draw(timestamp) { + console.log("send loose"); + if (!running) + return ; if (gameId === 0 ) { requestAnimationFrame(draw); @@ -333,7 +397,7 @@ function draw(timestamp) const deltaTime = timestamp - lastUpdateTime; lastUpdateTime = timestamp; ballX += vX * deltaTime * canvas.width; - ballY += vY * deltaTime * canvas.width; + ballY += vY * deltaTime * canvas.height; ctx.clearRect(0, 0, canvas.width, canvas.height); drawPaddle(); @@ -343,7 +407,8 @@ function draw(timestamp) is_out(); requestAnimationFrame(draw); } -requestAnimationFrame(draw); + + //======================================================================================================== //======================================================================================================== @@ -360,6 +425,13 @@ requestAnimationFrame(draw); vY = vX * Math.sin(-bounceAngle); if (vX < 0) vX = -vX; + if (speedModifier) + { + if (vX > 0) + vX += 0.0001; + else + vX -= 0.0001; + } } @@ -387,7 +459,12 @@ requestAnimationFrame(draw); } if (ballY - ballRadius - 2 <= 0 || ballY + ballRadius + 2 >= canvas.height) //touch up or down wall { + // if () vY = -vY; + if (ballY > (canvas.height / 2))//down wall + ballY = canvas.height - ballRadius - 2 + else + ballY = ballRadius + 2 // send_info(); } // else if (ballX + ballRadius + 2 >= canvas.width) //touch right wall @@ -416,6 +493,24 @@ requestAnimationFrame(draw); send_point(); // send_forced_info(); } + if (ballX > canvas.width) + { + console.log("win point") + // if (ballY <= paddleY + paddleHeight + ballRadius && ballY >= paddleY - ballRadius) + // { + // console.log('true hehe'); + // ballX = paddleX + paddleWidth + ballRadius; + // updateVector(); + // return ; + // } + // ballX = canvas.width / 2; + // ballY = canvas.height / 2; + // vX = 0; + // vY = 0; + // hisScore += 1; + // send_point(); + // // send_forced_info(); + } } @@ -510,8 +605,11 @@ requestAnimationFrame(draw); } else if (event.code === "KeyR") { + if (!superpowerModifier) + return ; paddleY = 0; paddleHeight = canvas.height; + use_power(); setTimeout(() => { // code à exécuter après 5 secondes paddleHeight = canvas.height * 0.25; @@ -521,4 +619,9 @@ requestAnimationFrame(draw); } }); -} \ No newline at end of file + requestAnimationFrame(draw); + console.log("retuuuuuuuuuuurn") + return (stopDrawCanvas); +} + +export default DrawCanvas \ No newline at end of file diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 07a89caa..bf7dbbb5 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -13,7 +13,7 @@ console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) let api = axios.create({ - baseURL: 'http://localhost/api', + baseURL: 'http://localhost/api', headers: { // Authorization: `Bearer ${getToken()}`, Authorization : `Bearer ${localStorage.getItem("token")}` diff --git a/docker-compose.yml b/docker-compose.yml index 0b3b1242..04b613cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,14 +8,25 @@ services: env_file: .env depends_on: - api + + # command: sh -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" ports: - 80:80 volumes: - - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf + - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf + # volumes: + # - "./conf:/etc/nginx/templates/" + # ports: + # - 80:80 + # volumes: + # - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf + # command: sh -c "envsubst < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" # - ./containers/frontend:/var/www/html networks: - pongNetwork + + react_app: image: node:latest container_name: react_app @@ -48,6 +59,7 @@ services: entrypoint: ["sh", "-c" , "npm install && npm run start:dev"] postgresql: + env_file: .env image: postgres:14.1-alpine restart: unless-stopped container_name: postgresql From f678d37739e0a0bad60d9286e21dd05488a81902 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Wed, 14 Jun 2023 01:45:06 +0200 Subject: [PATCH 02/55] add create conv in front, work ! and set good alert for add friend and add blocked, backend for friend and blocked still to do --- containers/api/src/app.controller.ts | 16 +++ containers/api/src/auth/login42.ts | 1 + containers/api/src/model/chat.entity.ts | 11 +- containers/api/src/model/user.entity.ts | 3 + containers/api/src/users/users.service.ts | 12 ++ .../react/src/components/Alert/GreenAlert.jsx | 2 +- .../react/src/components/Alert/RedAlert.jsx | 2 +- .../react/src/components/Messages/Chats.jsx | 128 ++++++++++++++---- .../react/src/components/Messages/Modal.jsx | 102 +++++++------- containers/react/src/styles/chat.css | 12 +- 10 files changed, 208 insertions(+), 81 deletions(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index e652ec46..b1692d3a 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -76,6 +76,15 @@ export class AppController { return await this.userService.addFriend(user, data.username); } + @UseGuards(JwtAuthGuard) + @Post('/block') + async newBlocked(@Request() req, @Body() data: any) { + // return await this.userService.getFriends(req.user.username); + console.log(`user= ${req.user.username}`) + const user = await this.userService.findOne(req.user.username) + return await this.userService.addBlocked(user, data.username); + } + @UseGuards(JwtAuthGuard) @Get('/invite') async getInvite(@Request() req) { @@ -317,13 +326,20 @@ export class AppController { //======================================================================================================== //======================================================================================================== + @UseGuards(JwtAuthGuard) @Post('/conv') async createConv(@Request() req, @Body() data: any) { ///create conv and return it ? id? console.log(`data post /conv= ${data}`); console.log(`data post /conv= ${data.members}`); console.log(`data post /conv= ${data.name}`); + + // const param = data; + const amIhere = data.members.includes(req.user.username); + if (!amIhere) + data.members.push(req.user.username) // let test = {id: 2, members: "cc"}; + data.owner = req.user.username return await this.chatService.createConv(data); // res.json(messages); } diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index 929afb39..da09b7f3 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -73,6 +73,7 @@ export class loginClass { otp_verified: false, friendRequest: null, friends: null, + blocked: null, photo: null, }; await this.usersService.create(user); diff --git a/containers/api/src/model/chat.entity.ts b/containers/api/src/model/chat.entity.ts index 246197ac..eb483c35 100644 --- a/containers/api/src/model/chat.entity.ts +++ b/containers/api/src/model/chat.entity.ts @@ -8,7 +8,7 @@ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, BaseEntity } @Column('text', { array: true, nullable: true }) members: string[]; - @Column({ nullable: true }) + @Column({ default: "Unnamed Conv" }) name: string @Column({ nullable: true }) @@ -17,11 +17,14 @@ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, BaseEntity } // @Column() // members: string;// arry ??? one to many ??? - @Column({ nullable: true }) - banned: string;// arry ??? one to many ??? + @Column('text', { array: true, nullable: true }) + banned: string[]; + + @Column('text', { array: true, nullable: true }) + admin: string[]; @Column({ nullable: true }) - admin: string;// arry ??? one to many ??? + owner: string; @Column({ nullable: true }) messages: string; diff --git a/containers/api/src/model/user.entity.ts b/containers/api/src/model/user.entity.ts index 1928c9fa..5ddd7709 100644 --- a/containers/api/src/model/user.entity.ts +++ b/containers/api/src/model/user.entity.ts @@ -68,6 +68,9 @@ export class User { @Column('text', { array: true, nullable: true }) friends: string[]; + @Column('text', { array: true, nullable: true }) + blocked: string[]; + @OneToMany(() => MatchLog, (child) => child.parent, { eager: true }) children: MatchLog[]; diff --git a/containers/api/src/users/users.service.ts b/containers/api/src/users/users.service.ts index 433cea6f..b8761fcf 100644 --- a/containers/api/src/users/users.service.ts +++ b/containers/api/src/users/users.service.ts @@ -79,9 +79,21 @@ export class UsersService { } async addFriend(user: User, username: string) { + if (!(await this.findOne(username))) + return (0); user.friends = user.friends || []; user.friends.push(username); this.save(user); + return (1); + } + + async addBlocked(user: User, username: string) { + if (!(await this.findOne(username))) + return (0); + user.blocked = user.blocked || []; + user.blocked.push(username); + this.save(user); + return (1); } async getRanking() { diff --git a/containers/react/src/components/Alert/GreenAlert.jsx b/containers/react/src/components/Alert/GreenAlert.jsx index cded387b..4cd27860 100644 --- a/containers/react/src/components/Alert/GreenAlert.jsx +++ b/containers/react/src/components/Alert/GreenAlert.jsx @@ -31,7 +31,7 @@ function GreenAlert ({handleClose, text}){

{text}

- {setTimeout(handleClose, 3000)} + {setTimeout(handleClose, 1500)} ) } diff --git a/containers/react/src/components/Alert/RedAlert.jsx b/containers/react/src/components/Alert/RedAlert.jsx index 3a9104b1..1a61f27d 100644 --- a/containers/react/src/components/Alert/RedAlert.jsx +++ b/containers/react/src/components/Alert/RedAlert.jsx @@ -30,7 +30,7 @@ function RedAlert ({handleClose, text}) {

{text}

- {setTimeout(handleClose, 3000)} + {setTimeout(handleClose, 1500)} ) } diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index 0fbf3230..b694b9ae 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -224,38 +224,75 @@ function Chats(){ } } + + const [friend, setFriend] = useState(""); const [modalOpen, setModalOpen] = useState(false); const [addFriend, setAddFriend] = useState(false); const [block, setBlock] = useState(false); + + const [showAddFriendAlert, setShowAddFriendAlert] = useState(false); + const [showBlockAlert, setShowBlockAlert] = useState(false); + const close = () => setModalOpen(false); const open = () => setModalOpen(true); - const closeAddFriend = () => setAddFriend(false); - const closeBlock = () => setBlock(false); - const handleFriend = e => { - setFriend(e.target.value) - }; + // const closeAddFriend = () => setAddFriend(false); + // const closeBlock = () => setBlock(false); - // const findValue = () => { - // // setFind(false); - // console.log(friend); - // Rank.map((tab) => { - // if (tab.name === friend) - // { - // console.log("ok bon"); - // setFind(true); - // } - // }) - // console.log(find); - // // if (!find) - // }; + + const handleFriend = (event) => { + setFriend(event.target.value); + }; - // console.log(`data user1= ${user.username}`) - - // while (user === null) - // ; + const handleAddFriend = async () => { + try{ + const res = await api.post("/friend", {username: friend}) + // if (res.data === 1) + // console.log("res in friend= ", res) + console.log("res in friend= ", res.data) + if(res.data === 1) + { + setAddFriend(true); + setBlock(false); // Reset block state + setShowBlockAlert(false); + } + else + setAddFriend(false); + setShowAddFriendAlert(true); + } catch(err) { + console.log(err) + } + }; + + const handleBlockFriend = async () => { + try{ + const res = await api.post("/block", {username: friend}) + // if(1) + if (res.data === 1) + { + setBlock(true); + setAddFriend(false); // Reset addFriend state + setShowAddFriendAlert(false); + } + else + setBlock(false); + setShowBlockAlert(true); + } catch(err) { + console.log(err) + } + }; + + const closeAddFriend = () => { + setAddFriend(false); + setShowAddFriendAlert(false); + }; + + const closeBlock = () => { + setBlock(false); + setShowBlockAlert(false); + }; //======================================================================================================== @@ -290,13 +327,17 @@ function Chats(){

{user.nickname}

)} -
+ + + + {/* work here bitch */} + + {/*
(addFriend ? setAddFriend(false) : setAddFriend(true))}> - {/* {console.log("find = ",find) && setFind(true)} */} {addFriend && } - {/* {console.log("find2 = ", find) && find && } */} -
+
*/} +
+ + + + + + null}> + {showAddFriendAlert && addFriend && ( + + )} + {showAddFriendAlert && !addFriend && ( + + )} + + + + + + + null}> + {showBlockAlert && block && ( + + )} + {showBlockAlert && !block && ( + + )} + + +
+ + + + + + +
diff --git a/containers/react/src/components/Messages/Modal.jsx b/containers/react/src/components/Messages/Modal.jsx index 4dea9b6e..9aa96f79 100644 --- a/containers/react/src/components/Messages/Modal.jsx +++ b/containers/react/src/components/Messages/Modal.jsx @@ -5,6 +5,7 @@ import '../../styles/Messages.css' import { useState } from "react"; import { GrAdd } from "react-icons/gr"; import { Link } from "react-router-dom"; +import api from "../../script/axiosApi"; const dropIn = { hidden:{y:"-100vh", @@ -23,11 +24,12 @@ const dropIn = { }; const Modal = ({handleClose, text}) => { - const [multi, setMulti] = useState(false); + // const [multi, setMulti] = useState(false); const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); const [selectedOptionArray, setSelectedOptionArray] = useState([]); const handleOptionChange = (selectId, selectedOption) => { + console.log("selected Option=", selectedOption) setSelectTag((prevTags) => prevTags.map((tag) => tag.id === selectId ? { ...tag, selectedOption } : tag @@ -38,11 +40,27 @@ const Modal = ({handleClose, text}) => { const addNewSelectedTag = () => { const newSelectedId = Math.max (...selectTags.map((tag) => tag.id)) + 1; setSelectTag([...selectTags, { id: newSelectedId, selectedOption: ''}]); + console.log(selectTags) }; const saveSelectedOptions = () => { - const selectedOptions = selectTags.map((tag) => tag.selectedOption); + // const selectedOptions = selectTags.map((tag) => tag.selectedOption); + const selectedOptions = selectTags.map((tag) => tag.selectedOption).filter((option) => option !== ''); + + console.log("selected= ", selectedOptions); + //do db stuff here + const data = { + members: selectedOptions, + name: "prout" + } + try{ + api.post("/conv", data); + handleClose(); + } catch(err) { + console.log(err); + } setSelectedOptionArray(selectedOptions); + } let new_name; return ( @@ -55,55 +73,43 @@ const Modal = ({handleClose, text}) => { animate="visible" exit="exit" > -

New Convewrstion

+ {/*

New Conversation

*/} -{/* First selection */} + {selectTags.map((selectTag) => ( +
+ +
+ ))} - -{/* Second selection */} - {selectTags.map((selectTag) =>( -
- - -
- )) - } -
-

Selected Option:

-
    - {selectedOptionArray.map((option, index) => ( -
  • {option}
  • - ))} -
-
-
- {multi === true ? ( - ) : " "} -
-
- Submit - - Cancel -
+
+ +
+
+

Selected Option:

+
    + {selectedOptionArray.map((option, index) => ( +
  • {option}
  • + ))} +
+
+
+ Submit + + Cancel +
diff --git a/containers/react/src/styles/chat.css b/containers/react/src/styles/chat.css index cf81842f..1a5681b2 100644 --- a/containers/react/src/styles/chat.css +++ b/containers/react/src/styles/chat.css @@ -156,4 +156,14 @@ bottom: 50px; font-size: 13px; font-style: italic; -} \ No newline at end of file +} + + +/* Messages.css */ +/* import '../../styles/Messages.css' */ + +/* General styles */ +/* Messages.css */ +/* import '../../styles/Messages.css' */ + +/* General styles \ No newline at end of file From c8a26fd297a4b684676eef1b11342800eaa38b00 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Wed, 14 Jun 2023 17:54:06 +0200 Subject: [PATCH 03/55] fix friend and block requests and replace dummy in New conversation --- containers/api/src/app.controller.ts | 32 ++++++++++++++- containers/api/src/users/users.service.ts | 39 ++++++++++++++----- .../react/src/components/Messages/Chats.jsx | 4 +- .../react/src/components/Messages/Modal.jsx | 30 ++++++++++---- .../src/components/Social/FriendRequest.jsx | 31 ++++++++++++--- .../react/src/components/Social/Social.jsx | 4 +- 6 files changed, 112 insertions(+), 28 deletions(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index b1692d3a..c5beab79 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -60,6 +60,13 @@ export class AppController { return await this.userService.findOne(data.username); } + @UseGuards(JwtAuthGuard) + @Get('/users') + async getUsers( @Body() data: any) { + console.log(`usernamewwww= ${data.username}`) + return await this.userService.findAll(); + } + @UseGuards(JwtAuthGuard) @Get('/friends') async getFriends(@Request() req) { @@ -68,11 +75,13 @@ export class AppController { } @UseGuards(JwtAuthGuard) - @Post('/friend') + @Post('/friend')//need to do it 2 time when user accept one for each async newFriend(@Request() req, @Body() data: any) { // return await this.userService.getFriends(req.user.username); console.log(`user= ${req.user.username}`) const user = await this.userService.findOne(req.user.username) + if (!user) + return (0); return await this.userService.addFriend(user, data.username); } @@ -86,7 +95,17 @@ export class AppController { } @UseGuards(JwtAuthGuard) - @Get('/invite') + @Post('/invite') + async newInvite(@Request() req, @Body() data: any) { + console.log(`user= ${req.user.username}`) + const user = await this.userService.findOne(data.username) + if (!user) + return (0); + return await this.userService.newInvite(user, req.user.username); + } + + @UseGuards(JwtAuthGuard) + @Get('/inviteRequest') async getInvite(@Request() req) { // return await this.userService.getFriends(req.user.username); console.log(`useawdawd\n\n\nr= ${req.user.username}`) @@ -94,6 +113,15 @@ export class AppController { return await this.userService.getInvite(req.user.username); } + @UseGuards(JwtAuthGuard) + @Post('/refuseInvite') + async refuseInvite(@Request() req, @Body() data: any) { + // return await this.userService.getFriends(req.user.username); + // console.log(`useawdawd\n\n\nr= ${req.user.username}`) + const user = await this.userService.findOne(req.user.username) + return await this.userService.refuseInvite(user, data.username); + } + @UseGuards(JwtAuthGuard) @Post('/status') async setStatus(@Request() req, @Body() data: any) { diff --git a/containers/api/src/users/users.service.ts b/containers/api/src/users/users.service.ts index b8761fcf..5b596874 100644 --- a/containers/api/src/users/users.service.ts +++ b/containers/api/src/users/users.service.ts @@ -49,6 +49,20 @@ export class UsersService { return (friends) } + async newInvite(user: User, username: string) { + if (!(await this.findOne(username))) + return (0); + // user.friendRequest = user.friendRequest || []; + // console.log("newInvite") + // console.log(user.friendRequest) + user.friendRequest = user.friendRequest || []; + if (user.friendRequest.find(item => item === username)) + return (1); + user.friendRequest.push(username); + this.save(user); + return (1); + } + async getInvite(username: string) { const user = await this.findOne(username) let friendsTab = user.friendRequest @@ -61,6 +75,11 @@ export class UsersService { return (friends) } + async refuseInvite(user: User, username: string) { + user.friendRequest = user.friendRequest.filter((item) => item !== username); + this.save(user); + } + async getHistory(username: string) { const user = await this.findOne(username); @@ -69,20 +88,22 @@ export class UsersService { console.log(user); console.log(user.children); // or perform any operations with the children return children; - // You can also access specific properties of each child - // children.forEach((child) => { - // console.log(child.id); - // console.log(child.opponent); - // // Access other child properties as needed - // }); } } async addFriend(user: User, username: string) { if (!(await this.findOne(username))) return (0); + // user.friendRequest = user.friendRequest || []; user.friends = user.friends || []; + if (user.friends.find(item => item === username)) + { + user.friendRequest = user.friendRequest.filter((item) => item !== username); + this.save(user); + return (1); + } user.friends.push(username); + user.friendRequest = user.friendRequest.filter((item) => item !== username); this.save(user); return (1); } @@ -91,6 +112,8 @@ export class UsersService { if (!(await this.findOne(username))) return (0); user.blocked = user.blocked || []; + if (user.blocked.find(item => item === username)) + return (1); user.blocked.push(username); this.save(user); return (1); @@ -103,10 +126,6 @@ export class UsersService { async getPic( username: string) { // const user = await this.findOne(username); let result = await this.userRepository.query("select encode(photo, 'base64') FROM public.\"User\" WHERE username = $1;", [username]); - // console.log(`result= ${result}`) - // console.log(`result= ${result.text}`) - // console.log(`encode= ${result.encode}`) - // console.log(`encode= ${result.string}`) if (result.length > 0) { const encodedPhoto = result[0].encode; console.log(`pic!!! =`) diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index b694b9ae..87b29cbf 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -248,7 +248,7 @@ function Chats(){ const handleAddFriend = async () => { try{ - const res = await api.post("/friend", {username: friend}) + const res = await api.post("/invite", {username: friend}) // if (res.data === 1) // console.log("res in friend= ", res) console.log("res in friend= ", res.data) @@ -368,7 +368,7 @@ function Chats(){ null}> {showAddFriendAlert && addFriend && ( - + )} {showAddFriendAlert && !addFriend && ( diff --git a/containers/react/src/components/Messages/Modal.jsx b/containers/react/src/components/Messages/Modal.jsx index 9aa96f79..0f32b24c 100644 --- a/containers/react/src/components/Messages/Modal.jsx +++ b/containers/react/src/components/Messages/Modal.jsx @@ -1,8 +1,8 @@ import { motion } from "framer-motion"; import Backdrop from "../Sidebar/Backdrop"; -import { Rank } from "../../DataBase/DataRank" +// import { Rank } from "../../DataBase/DataRank" import '../../styles/Messages.css' -import { useState } from "react"; +import { useState, useEffect } from "react"; import { GrAdd } from "react-icons/gr"; import { Link } from "react-router-dom"; import api from "../../script/axiosApi"; @@ -23,10 +23,25 @@ const dropIn = { }; -const Modal = ({handleClose, text}) => { +const Modal = ({handleClose}) => { // const [multi, setMulti] = useState(false); const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); const [selectedOptionArray, setSelectedOptionArray] = useState([]); + const [users, setUsers] = useState([]); + + useEffect(()=> { + + const getConv = async ()=>{ + try { + const tmpUsers = await api.get("/users"); + console.log("users=", tmpUsers.data); + setUsers(tmpUsers.data); + } catch(err){ + console.log(err) + } + } + getConv(); + }, []); const handleOptionChange = (selectId, selectedOption) => { console.log("selected Option=", selectedOption) @@ -62,7 +77,8 @@ const Modal = ({handleClose, text}) => { setSelectedOptionArray(selectedOptions); } - let new_name; + // let new_name; + return ( { - {Rank.filter((item) => !selectTags.some((tag) => tag.selectedOption === item.name)).map((item, index) => ( - ))} diff --git a/containers/react/src/components/Social/FriendRequest.jsx b/containers/react/src/components/Social/FriendRequest.jsx index 29020c86..7db7f0bd 100644 --- a/containers/react/src/components/Social/FriendRequest.jsx +++ b/containers/react/src/components/Social/FriendRequest.jsx @@ -28,14 +28,18 @@ const SideP = styled.p` export default function Friend({currentUser}) { const [profilePicture, setProfilePicture] = useState(''); - const [request, setRequest] = useState(''); + const [request, setRequest] = useState(''); //user who invite + const [clickEvent, setClickEvent] = useState(false); + // const [user, setUser] = useState(null); useEffect(() => { const fetchProfilePicture = async () => { try { - // const user = await api.get("/profile"); + // const user = await api.get("/profile");\ + // const tmpUser = await api.get("/profile") const pic = await api.post("/getPicture", {username: currentUser.username}) const tmpRequest = await api.post("/user", {username: currentUser.username}) + // setUser(tmpUser.data); setRequest(tmpRequest.data); // console.log(`user naem profile pic222= ${currentUser.username}`) // console.log(` profile pic222= ${pic.data}`) @@ -46,7 +50,7 @@ export default function Friend({currentUser}) }; fetchProfilePicture(); - }, []) + }, [clickEvent]) const handleButtonClick = (user) => { let path = `http://localhost/profile/${user.username}`; @@ -56,16 +60,33 @@ export default function Friend({currentUser}) window.location.reload(false); }; - const Accept = (user) => { + const Accept = async (request) => { + try{ + await api.post("/friend", {username: request.username}) + setClickEvent(true); + } catch(err) { + console.log(err); + } console.log("accept") console.log(`request = ${request}`) } - const Refuse = (user) => { + const Refuse = async (request) => { + try{ + await api.post("/refuseInvite", {username: request.username}) + setClickEvent(true); + } catch(err) { + console.log(err); + } console.log("refuse") console.log(`request = ${request}`) } + // Vérifier si le contenu doit être caché + if (clickEvent) { + return null; // Rendre null pour ne pas afficher le contenu + } + return ( {profilePicture ? ( diff --git a/containers/react/src/components/Social/Social.jsx b/containers/react/src/components/Social/Social.jsx index ef09288f..8f6b71e5 100644 --- a/containers/react/src/components/Social/Social.jsx +++ b/containers/react/src/components/Social/Social.jsx @@ -42,9 +42,9 @@ function Social (){ const getFriend = async ()=>{ try{ - const tmpFriends = await api.get("/friends") + const tmpFriends = await api.get("/friends") const tmpUser = await api.get("/profile") - const tmpInv = await api.get("/invite") + const tmpInv = await api.get("/inviteRequest") const pic = await api.post("/getPicture", {username: tmpUser.data.username}) setInvite(tmpInv.data); From 8cb756a2ae068369cc143c838679ff635f48c435 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 14:09:33 +0200 Subject: [PATCH 04/55] auto push --- containers/test | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 containers/test diff --git a/containers/test b/containers/test new file mode 100644 index 00000000..e69de29b From c501524a403a5111cf9a85a37c6cc677c0cdd9ca Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 14:22:11 +0200 Subject: [PATCH 05/55] auto push --- containers/test | 1 + 1 file changed, 1 insertion(+) diff --git a/containers/test b/containers/test index e69de29b..3deae27f 100644 --- a/containers/test +++ b/containers/test @@ -0,0 +1 @@ +cc toi \ No newline at end of file From 08985f9eeca675901b762eab1c4c8ab3725972e5 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 14:24:11 +0200 Subject: [PATCH 06/55] auto push --- containers/test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/containers/test b/containers/test index 3deae27f..f7eced04 100644 --- a/containers/test +++ b/containers/test @@ -1 +1,2 @@ -cc toi \ No newline at end of file +cc toi +cc 2 \ No newline at end of file From 2107ab31a4e4989d54867518d63ae19cbd0b703b Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:23:11 +0200 Subject: [PATCH 07/55] auto push --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 04b613cb..97febb2a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: # command: sh -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" ports: - - 80:80 + - 8080:8080 volumes: - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf # volumes: From ad7016c4650e2eeafd33c18fbe2cabc1cb04ffcf Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:27:11 +0200 Subject: [PATCH 08/55] auto push --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 97febb2a..04b613cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: # command: sh -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" ports: - - 8080:8080 + - 80:80 volumes: - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf # volumes: From 23c601187340151e4a624b4a4fa045050ce6786a Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:46:11 +0200 Subject: [PATCH 09/55] auto push --- containers/react/src/script/axiosApi.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index bf7dbbb5..f43c7ee7 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -13,7 +13,8 @@ console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) let api = axios.create({ - baseURL: 'http://localhost/api', +// baseURL: 'http://localhost/api', +baseURL: 'http://localhost/api', headers: { // Authorization: `Bearer ${getToken()}`, Authorization : `Bearer ${localStorage.getItem("token")}` From 268f2d12779a4e2bf38d50a511ea1a438a217b7b Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:47:11 +0200 Subject: [PATCH 10/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index f43c7ee7..27a17a8c 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -14,7 +14,7 @@ console.log(`Bearer ${localStorage.getItem("token")}`) let api = axios.create({ // baseURL: 'http://localhost/api', -baseURL: 'http://localhost/api', +baseURL: 'http://' + process.env.BASE_URL + '/api', headers: { // Authorization: `Bearer ${getToken()}`, Authorization : `Bearer ${localStorage.getItem("token")}` From d6f467386e868e99787c39b24deb103cf9fe96f2 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:49:11 +0200 Subject: [PATCH 11/55] auto push --- containers/react/src/script/axiosApi.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 27a17a8c..28eaffa2 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -12,6 +12,10 @@ function getToken() { console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) +const url = + +console.log("url= ", url) + let api = axios.create({ // baseURL: 'http://localhost/api', baseURL: 'http://' + process.env.BASE_URL + '/api', From 799534a9b75db8ba1f95c6c143ccdf96869be3a0 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:50:11 +0200 Subject: [PATCH 12/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 28eaffa2..885c7d06 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -12,7 +12,7 @@ function getToken() { console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) -const url = +const url = 'http://' + process.env.BASE_URL + '/api' console.log("url= ", url) From 0a34bbf1e5e2f3869e76e33de38a7e5588fd8d86 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:54:11 +0200 Subject: [PATCH 13/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 885c7d06..093d9787 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -12,7 +12,7 @@ function getToken() { console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) -const url = 'http://' + process.env.BASE_URL + '/api' +const url = 'http://' + {process.env.BASE_URL} + '/api' console.log("url= ", url) From 2dcd6bdb47698dfc3f5fca84e9a21d85b5d015a9 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:55:11 +0200 Subject: [PATCH 14/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 093d9787..885c7d06 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -12,7 +12,7 @@ function getToken() { console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) -const url = 'http://' + {process.env.BASE_URL} + '/api' +const url = 'http://' + process.env.BASE_URL + '/api' console.log("url= ", url) From 9bfab8f9b791c03ecfdb05823d23aafca1739be3 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:57:11 +0200 Subject: [PATCH 15/55] auto push --- containers/react/.env | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 containers/react/.env diff --git a/containers/react/.env b/containers/react/.env new file mode 100644 index 00000000..e69de29b From 1c5cfd949e39bb45fe16de5886f017b5a80931b8 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 16:58:11 +0200 Subject: [PATCH 16/55] auto push --- containers/react/.env | 1 + containers/react/src/script/axiosApi.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/containers/react/.env b/containers/react/.env index e69de29b..e4c43b6d 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -0,0 +1 @@ +BASE_URL=http://localhost \ No newline at end of file diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 885c7d06..1a98263b 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -15,6 +15,8 @@ console.log(`Bearer ${localStorage.getItem("token")}`) const url = 'http://' + process.env.BASE_URL + '/api' console.log("url= ", url) +console.log("env= ", process.env) +console.log("env= ", process.env.BASE_URL) let api = axios.create({ // baseURL: 'http://localhost/api', From 1fc843740ece78076041db29e9893f9a56ed7052 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:00:11 +0200 Subject: [PATCH 17/55] auto push --- containers/react/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/.env b/containers/react/.env index e4c43b6d..bc523d0d 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -1 +1 @@ -BASE_URL=http://localhost \ No newline at end of file +BASE_URL=localhost \ No newline at end of file From c4c360c7a2da19a8e261dbeab65a19086b6a07a6 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:01:11 +0200 Subject: [PATCH 18/55] auto push --- containers/react/src/script/axiosApi.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 1a98263b..17ecabce 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -12,7 +12,9 @@ function getToken() { console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) -const url = 'http://' + process.env.BASE_URL + '/api' +const test = "192.168.1.19" +// const url = 'http://' + process.env.BASE_URL + '/api' +const url = 'http://' + test + '/api' console.log("url= ", url) console.log("env= ", process.env) From 080987cc31e0f6359958b64366ba42a762ba3bfc Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:02:11 +0200 Subject: [PATCH 19/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 17ecabce..4351c2e4 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -17,7 +17,7 @@ const test = "192.168.1.19" const url = 'http://' + test + '/api' console.log("url= ", url) -console.log("env= ", process.env) +console.log("test= ", test) console.log("env= ", process.env.BASE_URL) let api = axios.create({ From a83842ae9d711479ec48b8a8136461587350253a Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:03:11 +0200 Subject: [PATCH 20/55] auto push --- containers/react/src/script/axiosApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 4351c2e4..4d0a2717 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -22,7 +22,7 @@ console.log("env= ", process.env.BASE_URL) let api = axios.create({ // baseURL: 'http://localhost/api', -baseURL: 'http://' + process.env.BASE_URL + '/api', +baseURL: 'http://' + test + '/api', headers: { // Authorization: `Bearer ${getToken()}`, Authorization : `Bearer ${localStorage.getItem("token")}` From 3a0ceabcd0a610cb862decef7c891a61ebe3e91b Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:48:11 +0200 Subject: [PATCH 21/55] auto push --- containers/api/src/app.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index c5beab79..08e30ba6 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -267,7 +267,7 @@ export class AppController { -@Redirect('http://localhost/token', 302) +@Redirect('http://'localhost'/token', 302) @Get('auth/login') async login2(@Req() request: Request) { const url = request.url; From 776e36d310d3d9bf5b1611ab1c501dbb33bc6a36 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:49:11 +0200 Subject: [PATCH 22/55] auto push --- containers/api/src/app.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index 08e30ba6..c5c60ace 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -267,7 +267,7 @@ export class AppController { -@Redirect('http://'localhost'/token', 302) +@Redirect('http://' + process.env.BASE_URL + '/token', 302) @Get('auth/login') async login2(@Req() request: Request) { const url = request.url; From 9a141a829dcc66c4a72830c7d54c8ca49b84b99f Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:50:11 +0200 Subject: [PATCH 23/55] auto push --- containers/api/src/app.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index c5c60ace..f71d4eb5 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -285,7 +285,7 @@ export class AppController { const token = (await data).access_token; // console await this.userService.save(user); - return { url: `http://localhost/token?data=${encodeURIComponent(JSON.stringify(token))}` }; + return { url: 'http://' + process.env.BASE_URL + 'localhost/token?data=${encodeURIComponent(JSON.stringify(token))}' }; } @UseGuards(JwtAuthGuard) From 313eefd752a11dc7c897a102a2ed2072a15027d8 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:51:11 +0200 Subject: [PATCH 24/55] auto push --- containers/api/src/app.controller.ts | 2 +- containers/react/.env | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index f71d4eb5..791dece9 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -285,7 +285,7 @@ export class AppController { const token = (await data).access_token; // console await this.userService.save(user); - return { url: 'http://' + process.env.BASE_URL + 'localhost/token?data=${encodeURIComponent(JSON.stringify(token))}' }; + return { url: 'http://' + process.env.BASE_URL + '/token?data=${encodeURIComponent(JSON.stringify(token))}' }; } @UseGuards(JwtAuthGuard) diff --git a/containers/react/.env b/containers/react/.env index bc523d0d..5e340cd3 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -1 +1 @@ -BASE_URL=localhost \ No newline at end of file +BASE_URL=192.168.1.19 \ No newline at end of file From 82fc61885df8e9944d9eabd9c024c7d57d70abfd Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 17:55:02 +0200 Subject: [PATCH 25/55] auto push --- .env | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.env b/.env index e81c3999..c204e9a1 100644 --- a/.env +++ b/.env @@ -13,7 +13,8 @@ #URL NGINX_ENVSUBST_TEMPLATE_SUFFIX=".conf" -BASE_URL=http://localhost +# BASE_URL=http://localhost +BASE_URL=192.168.1.19 #postgres var # POSTGRES_HOST=127.0.0.1 From 7b8e3983c57b1aafef0cfed06c8d39ba2692ae35 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:05:04 +0200 Subject: [PATCH 26/55] auto push --- containers/react/src/components/App.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/react/src/components/App.jsx b/containers/react/src/components/App.jsx index 27d570b3..7308c286 100644 --- a/containers/react/src/components/App.jsx +++ b/containers/react/src/components/App.jsx @@ -30,8 +30,8 @@ function AnimatedRoute () { }/> }/> - } /> - } /> + {/* } /> */} + {/* } /> */} ) From 8a706ad98727f29c0b9c1205a76f3abf9a7da909 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:11:04 +0200 Subject: [PATCH 27/55] auto push --- containers/api/src/auth/login42.ts | 2 +- containers/react/src/components/Profile/Logout.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index da09b7f3..12b23014 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -28,7 +28,7 @@ export class loginClass { // client_secret: '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', client_secret: process.env.API_SECRET, code: code, - redirect_uri: process.env.REDIRECT_URI || 'http://localhost:80/api/auth/login', + redirect_uri: process.env.REDIRECT_URI || 'http://192.168.1.19:80/api/auth/login', }; try { diff --git a/containers/react/src/components/Profile/Logout.jsx b/containers/react/src/components/Profile/Logout.jsx index dd422844..788e7b62 100644 --- a/containers/react/src/components/Profile/Logout.jsx +++ b/containers/react/src/components/Profile/Logout.jsx @@ -4,7 +4,7 @@ function Logout(){ localStorage.clear(); - const path = `http://localhost/`; + const path = `http://''/`; // history(path, { replace: true }); // window.location.replace(path); // window.history.pushState({}, '', path); From aac7bfef3b4c53f697de0c87ed4d302c407ebec7 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:12:04 +0200 Subject: [PATCH 28/55] auto push --- containers/react/src/components/Profile/Logout.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/components/Profile/Logout.jsx b/containers/react/src/components/Profile/Logout.jsx index 788e7b62..8a473a18 100644 --- a/containers/react/src/components/Profile/Logout.jsx +++ b/containers/react/src/components/Profile/Logout.jsx @@ -4,7 +4,7 @@ function Logout(){ localStorage.clear(); - const path = `http://''/`; + const path = 'http://' + process.env.BASE_URL + '/'; // history(path, { replace: true }); // window.location.replace(path); // window.history.pushState({}, '', path); From 3b1e80503b1e7ff057c169d38205328239dfc8ae Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:14:04 +0200 Subject: [PATCH 29/55] auto push --- containers/react/src/pages/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/pages/Home.js b/containers/react/src/pages/Home.js index 5273ff21..3b255b54 100644 --- a/containers/react/src/pages/Home.js +++ b/containers/react/src/pages/Home.js @@ -26,7 +26,7 @@ function HomeLogin() return ; } // else - let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2Flocalhost%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; + let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; window.location.replace(path); }; From d6356c6520bd549812d1b91e60872bffda2e09ad Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:15:04 +0200 Subject: [PATCH 30/55] auto push --- containers/react/src/pages/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/pages/Home.js b/containers/react/src/pages/Home.js index 3b255b54..ae72887c 100644 --- a/containers/react/src/pages/Home.js +++ b/containers/react/src/pages/Home.js @@ -26,7 +26,7 @@ function HomeLogin() return ; } // else - let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; + let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; window.location.replace(path); }; From 25b955030beea2dcd02107699312d76b88c04345 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:17:04 +0200 Subject: [PATCH 31/55] auto push --- containers/react/.env | 3 ++- containers/react/src/components/Profile/Logout.jsx | 2 +- containers/react/src/pages/Home.js | 2 +- containers/react/src/script/axiosApi.js | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/containers/react/.env b/containers/react/.env index 5e340cd3..1be57bc2 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -1 +1,2 @@ -BASE_URL=192.168.1.19 \ No newline at end of file +REACT_APP_BASE_URL=192.168.1.19 +# REACT_APP_BASE_URL=192.168.1.19 \ No newline at end of file diff --git a/containers/react/src/components/Profile/Logout.jsx b/containers/react/src/components/Profile/Logout.jsx index 8a473a18..029078d5 100644 --- a/containers/react/src/components/Profile/Logout.jsx +++ b/containers/react/src/components/Profile/Logout.jsx @@ -4,7 +4,7 @@ function Logout(){ localStorage.clear(); - const path = 'http://' + process.env.BASE_URL + '/'; + const path = 'http://' + process.env.REACT_APP_BASE_URL + '/'; // history(path, { replace: true }); // window.location.replace(path); // window.history.pushState({}, '', path); diff --git a/containers/react/src/pages/Home.js b/containers/react/src/pages/Home.js index ae72887c..76d98fcf 100644 --- a/containers/react/src/pages/Home.js +++ b/containers/react/src/pages/Home.js @@ -26,7 +26,7 @@ function HomeLogin() return ; } // else - let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; + let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.REACT_APP_BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; window.location.replace(path); }; diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 4d0a2717..8a73d37a 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -13,12 +13,12 @@ console.log(`getToken = ${getToken()}`) console.log(`Bearer ${localStorage.getItem("token")}`) const test = "192.168.1.19" -// const url = 'http://' + process.env.BASE_URL + '/api' +// const url = 'http://' + process.env.REACT_APP_BASE_URL + '/api' const url = 'http://' + test + '/api' console.log("url= ", url) console.log("test= ", test) -console.log("env= ", process.env.BASE_URL) +console.log("env= ", process.env.REACT_APP_BASE_URL) let api = axios.create({ // baseURL: 'http://localhost/api', From 1cb5f86b2980612368567adb37b4f8bf8d9c8252 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:18:03 +0200 Subject: [PATCH 32/55] auto push --- .env | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.env b/.env index c204e9a1..8b482b83 100644 --- a/.env +++ b/.env @@ -15,7 +15,7 @@ NGINX_ENVSUBST_TEMPLATE_SUFFIX=".conf" # BASE_URL=http://localhost BASE_URL=192.168.1.19 - +REACT_APP_BASE_URL=192.168.1.19 #postgres var # POSTGRES_HOST=127.0.0.1 # DB_TYPE=postgres @@ -40,6 +40,7 @@ REACT_HOST=0.0.0.0 #auth var JWT_SECRET=secrethere -REDIRECT_URI=http://localhost:80/api/auth/login +# REDIRECT_URI=http://localhost:80/api/auth/login +REDIRECT_URI=http://192.168.1.19:80/api/auth/login API_SECRET=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 CLIENT_UID=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41 \ No newline at end of file From 58a2968daf1c1eec6356f6485c2343bbd957a78d Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:22:04 +0200 Subject: [PATCH 33/55] auto push --- containers/api/src/app.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index 791dece9..7c20f0ca 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -285,7 +285,7 @@ export class AppController { const token = (await data).access_token; // console await this.userService.save(user); - return { url: 'http://' + process.env.BASE_URL + '/token?data=${encodeURIComponent(JSON.stringify(token))}' }; + return { url: 'http://' + process.env.BASE_URL + `/token?data=${encodeURIComponent(JSON.stringify(token))}` }; } @UseGuards(JwtAuthGuard) From 00aafd9d8ef31e96feb8af9aa89576a66f9a614b Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:25:04 +0200 Subject: [PATCH 34/55] auto push --- containers/api/src/auth/login42.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index 12b23014..33dcb7e8 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -28,7 +28,7 @@ export class loginClass { // client_secret: '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', client_secret: process.env.API_SECRET, code: code, - redirect_uri: process.env.REDIRECT_URI || 'http://192.168.1.19:80/api/auth/login', + redirect_uri: process.env.REDIRECT_URI || 'http://'192.168.1.19':80/api/auth/login', }; try { From 594969b93a594613c81b474b6a7cea9545f9a09a Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:26:04 +0200 Subject: [PATCH 35/55] auto push --- containers/api/src/auth/login42.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index 33dcb7e8..e098ecf4 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -28,7 +28,7 @@ export class loginClass { // client_secret: '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', client_secret: process.env.API_SECRET, code: code, - redirect_uri: process.env.REDIRECT_URI || 'http://'192.168.1.19':80/api/auth/login', + redirect_uri: process.env.REDIRECT_URI || 'http://'+ process.env.REACT_APP_BASE_URL +'/api/auth/login', }; try { From 16c46744ca3bafcc09d0cb911d7f15150e83e3eb Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:27:04 +0200 Subject: [PATCH 36/55] auto push --- containers/api/src/auth/login42.ts | 2 +- containers/react/src/pages/canvas.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/api/src/auth/login42.ts b/containers/api/src/auth/login42.ts index e098ecf4..8f44f2e4 100644 --- a/containers/api/src/auth/login42.ts +++ b/containers/api/src/auth/login42.ts @@ -28,7 +28,7 @@ export class loginClass { // client_secret: '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', client_secret: process.env.API_SECRET, code: code, - redirect_uri: process.env.REDIRECT_URI || 'http://'+ process.env.REACT_APP_BASE_URL +'/api/auth/login', + redirect_uri: process.env.REDIRECT_URI || 'http://' + process.env.REACT_APP_BASE_URL + '/api/auth/login', }; try { diff --git a/containers/react/src/pages/canvas.js b/containers/react/src/pages/canvas.js index ae4785ff..d8d90664 100644 --- a/containers/react/src/pages/canvas.js +++ b/containers/react/src/pages/canvas.js @@ -390,7 +390,7 @@ function draw(timestamp) api.post('/status', {status: 1}); console.log("send loose"); } - window.location.replace("http://localhost/pong"); + window.location.replace("http://" + process.env.REACT_APP_BASE_URL + "/pong"); return ; } From fb65a41dea91570c8aeb232737acccdd3d406fdd Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:28:04 +0200 Subject: [PATCH 37/55] auto push --- containers/react/src/script/tokenSuccess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/script/tokenSuccess.js b/containers/react/src/script/tokenSuccess.js index 87686fca..e8756513 100644 --- a/containers/react/src/script/tokenSuccess.js +++ b/containers/react/src/script/tokenSuccess.js @@ -7,7 +7,7 @@ function SuccessToken() { const cleanData = data.slice(1, -1); localStorage.setItem('token', `${cleanData}`); console.log(`prout token2= ${localStorage.getItem('token')}`) - window.location.replace("http://localhost/pong"); + window.location.replace("http://" + process.env.REACT_APP_BASE_URL + "/pong"); } export default SuccessToken; \ No newline at end of file From cdb7c748929f03daa0390517fb7bbd9df79f3fc1 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:40:04 +0200 Subject: [PATCH 38/55] auto push --- containers/react/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/.env b/containers/react/.env index 1be57bc2..164f6aa7 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -1,2 +1,2 @@ -REACT_APP_BASE_URL=192.168.1.19 +REACT_APP_BASE_URL=92.143.191.152 # REACT_APP_BASE_URL=192.168.1.19 \ No newline at end of file From 70f9535847ca4dec036779062952fbd3f010695f Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:42:03 +0200 Subject: [PATCH 39/55] auto push --- .env | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.env b/.env index 8b482b83..4b96a475 100644 --- a/.env +++ b/.env @@ -14,8 +14,9 @@ NGINX_ENVSUBST_TEMPLATE_SUFFIX=".conf" # BASE_URL=http://localhost -BASE_URL=192.168.1.19 -REACT_APP_BASE_URL=192.168.1.19 +BASE_URL=92.143.191.152 +REACT_APP_BASE_URL=92.143.191.152 +REDIRECT_URI=http://92.143.191.152/api/auth/login #postgres var # POSTGRES_HOST=127.0.0.1 # DB_TYPE=postgres @@ -41,6 +42,5 @@ REACT_HOST=0.0.0.0 #auth var JWT_SECRET=secrethere # REDIRECT_URI=http://localhost:80/api/auth/login -REDIRECT_URI=http://192.168.1.19:80/api/auth/login API_SECRET=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 CLIENT_UID=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41 \ No newline at end of file From 381d188c79c5a4fd971e3e19134e8bec62867cdc Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:48:04 +0200 Subject: [PATCH 40/55] auto push --- containers/react/src/pages/Home.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/containers/react/src/pages/Home.js b/containers/react/src/pages/Home.js index 76d98fcf..62cee02d 100644 --- a/containers/react/src/pages/Home.js +++ b/containers/react/src/pages/Home.js @@ -26,7 +26,8 @@ function HomeLogin() return ; } // else - let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.REACT_APP_BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; + // let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.REACT_APP_BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; + let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F92.143.191.152%2Fapi%2Fauth%2Flogin&response_type=code" window.location.replace(path); }; From 9dcf0e7eb61a18c0215401f3e3e61edb95fa3da6 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:54:04 +0200 Subject: [PATCH 41/55] auto push --- containers/react/src/script/axiosApi.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/containers/react/src/script/axiosApi.js b/containers/react/src/script/axiosApi.js index 8a73d37a..8a9c80b9 100644 --- a/containers/react/src/script/axiosApi.js +++ b/containers/react/src/script/axiosApi.js @@ -14,15 +14,15 @@ console.log(`Bearer ${localStorage.getItem("token")}`) const test = "192.168.1.19" // const url = 'http://' + process.env.REACT_APP_BASE_URL + '/api' -const url = 'http://' + test + '/api' +// const url = 'http://' + test + '/api' -console.log("url= ", url) +// console.log("url= ", url) console.log("test= ", test) console.log("env= ", process.env.REACT_APP_BASE_URL) let api = axios.create({ // baseURL: 'http://localhost/api', -baseURL: 'http://' + test + '/api', +baseURL: 'http://' + process.env.REACT_APP_BASE_URL + '/api', headers: { // Authorization: `Bearer ${getToken()}`, Authorization : `Bearer ${localStorage.getItem("token")}` From b741a0fd228f64cf81afe1048bc9b8409ef5fdfa Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:55:04 +0200 Subject: [PATCH 42/55] auto push --- containers/react/src/pages/canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/pages/canvas.js b/containers/react/src/pages/canvas.js index d8d90664..ca686f11 100644 --- a/containers/react/src/pages/canvas.js +++ b/containers/react/src/pages/canvas.js @@ -25,7 +25,7 @@ function DrawCanvas(option) { // const socketRef = useRef(null); // socketRef.current = io('http://localhost:4000'); - const socket = io('http://localhost:4000'); + const socket = io('http://' + process.env. + ':4000'); // const socket = socketRef.current console.log("start function"); const canvas = document.getElementById('myCanvas'); From 84a0acf48aa2cd6bdf92f44969d2c21483dba101 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:56:04 +0200 Subject: [PATCH 43/55] auto push --- containers/react/src/pages/canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/pages/canvas.js b/containers/react/src/pages/canvas.js index ca686f11..f0e3fbf5 100644 --- a/containers/react/src/pages/canvas.js +++ b/containers/react/src/pages/canvas.js @@ -25,7 +25,7 @@ function DrawCanvas(option) { // const socketRef = useRef(null); // socketRef.current = io('http://localhost:4000'); - const socket = io('http://' + process.env. + ':4000'); + const socket = io('http://' + process.env.REACT_APP_BASE_URL + ':4000'); // const socket = socketRef.current console.log("start function"); const canvas = document.getElementById('myCanvas'); From 551b16434263894abcf2a9ba583407ae00c060f4 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 18:57:04 +0200 Subject: [PATCH 44/55] auto push --- containers/react/src/pages/canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/pages/canvas.js b/containers/react/src/pages/canvas.js index f0e3fbf5..a928bd43 100644 --- a/containers/react/src/pages/canvas.js +++ b/containers/react/src/pages/canvas.js @@ -362,7 +362,7 @@ matchmaking(); function draw(timestamp) { - console.log("send loose"); + console.log("turning"); if (!running) return ; if (gameId === 0 ) From b4562d0f83b12b46759e6152086d550f96ebf6b0 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:03:04 +0200 Subject: [PATCH 45/55] auto push --- containers/react/src/components/Messages/Chats.jsx | 2 +- containers/react/src/components/Social/Friend.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index 87b29cbf..fdd812e5 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -104,7 +104,7 @@ function Chats(){ // console.log(`user= ${tmpUser.data.username}`); // console.log(`user= ${tmpUser.data.nickname}`); // console.log(`user= ${tmpUser.data}`); - socket.current = io("ws://localhost:4001"); + socket.current = io("ws://" + process.env.REACT_APP_BASE_URL + ":4001"); console.log(`connection....`); socket.current.emit('connection', {username: tmpUser.data.username}) // const socket = io("http://localhost:4001", { diff --git a/containers/react/src/components/Social/Friend.jsx b/containers/react/src/components/Social/Friend.jsx index 8630f8c1..c68146c4 100644 --- a/containers/react/src/components/Social/Friend.jsx +++ b/containers/react/src/components/Social/Friend.jsx @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/09 08:18:58 by apommier #+# #+# */ -/* Updated: 2023/06/09 08:35:21 by apommier ### ########.fr */ +/* Updated: 2023/06/15 19:03:01 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,7 +79,7 @@ export default function Friend({currentUser}) }; const handleButtonClick = (user) => { - let path = `http://localhost/profile/${user.username}`; + let path = `http://` process.env.REACT_APP_BASE_URL `/profile/${user.username}`; // history(path, { replace: true }); // window.location.replace(path); window.history.pushState({}, null, path); From 1e3752a93b90c650e3d9b3a99184c928ef81faa9 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:04:04 +0200 Subject: [PATCH 46/55] auto push --- containers/react/src/components/Social/Friend.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/containers/react/src/components/Social/Friend.jsx b/containers/react/src/components/Social/Friend.jsx index c68146c4..ce2bafb5 100644 --- a/containers/react/src/components/Social/Friend.jsx +++ b/containers/react/src/components/Social/Friend.jsx @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/09 08:18:58 by apommier #+# #+# */ -/* Updated: 2023/06/15 19:03:01 by apommier ### ########.fr */ +/* Updated: 2023/06/15 19:03:04 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,7 +79,7 @@ export default function Friend({currentUser}) }; const handleButtonClick = (user) => { - let path = `http://` process.env.REACT_APP_BASE_URL `/profile/${user.username}`; + let path = `http://` + process.env.REACT_APP_BASE_URL + `/profile/${user.username}`; // history(path, { replace: true }); // window.location.replace(path); window.history.pushState({}, null, path); From 55b17891fb4046d3f491e2c42ad428d4b767e8e1 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:06:04 +0200 Subject: [PATCH 47/55] auto push --- containers/react/src/components/Social/Friend.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/containers/react/src/components/Social/Friend.jsx b/containers/react/src/components/Social/Friend.jsx index ce2bafb5..8627b503 100644 --- a/containers/react/src/components/Social/Friend.jsx +++ b/containers/react/src/components/Social/Friend.jsx @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/09 08:18:58 by apommier #+# #+# */ -/* Updated: 2023/06/15 19:03:04 by apommier ### ########.fr */ +/* Updated: 2023/06/15 19:05:14 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,7 +79,8 @@ export default function Friend({currentUser}) }; const handleButtonClick = (user) => { - let path = `http://` + process.env.REACT_APP_BASE_URL + `/profile/${user.username}`; + let path = `http://` + process.env.REACT_APP_BASE_URL + `/profile/${user.username}`; + console.log("path= ", path) // history(path, { replace: true }); // window.location.replace(path); window.history.pushState({}, null, path); From 7b0008a5f48564085a43079aa3dd657198b460f0 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:08:04 +0200 Subject: [PATCH 48/55] auto push --- containers/react/src/components/Messages/Chats.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index fdd812e5..04724e77 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -104,7 +104,7 @@ function Chats(){ // console.log(`user= ${tmpUser.data.username}`); // console.log(`user= ${tmpUser.data.nickname}`); // console.log(`user= ${tmpUser.data}`); - socket.current = io("ws://" + process.env.REACT_APP_BASE_URL + ":4001"); + socket.current = io("http://" + process.env.REACT_APP_BASE_URL + ":4001"); console.log(`connection....`); socket.current.emit('connection', {username: tmpUser.data.username}) // const socket = io("http://localhost:4001", { From 539a0efaa5fa3f92faeac1ef892ad45c7f7a24ec Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:09:04 +0200 Subject: [PATCH 49/55] auto push --- containers/react/src/components/Messages/Chats.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index 04724e77..286c46ee 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -104,7 +104,7 @@ function Chats(){ // console.log(`user= ${tmpUser.data.username}`); // console.log(`user= ${tmpUser.data.nickname}`); // console.log(`user= ${tmpUser.data}`); - socket.current = io("http://" + process.env.REACT_APP_BASE_URL + ":4001"); + socket.current = io('http://' + process.env.REACT_APP_BASE_URL + ':4001'); console.log(`connection....`); socket.current.emit('connection', {username: tmpUser.data.username}) // const socket = io("http://localhost:4001", { From 252c61147667fab090c028c643e769fa1a4f2709 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 15 Jun 2023 19:10:04 +0200 Subject: [PATCH 50/55] auto push --- containers/react/src/components/Social/FriendRequest.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/react/src/components/Social/FriendRequest.jsx b/containers/react/src/components/Social/FriendRequest.jsx index 7db7f0bd..5f2f7c8a 100644 --- a/containers/react/src/components/Social/FriendRequest.jsx +++ b/containers/react/src/components/Social/FriendRequest.jsx @@ -53,7 +53,7 @@ export default function Friend({currentUser}) }, [clickEvent]) const handleButtonClick = (user) => { - let path = `http://localhost/profile/${user.username}`; + let path = `http://` + process.env.REACT_APP_BASE_URL + `/profile/${user.username}`; // history(path, { replace: true }); // window.location.replace(path); window.history.pushState({}, null, path); From 7d455a342ce9db8d562cf963b11e06f0d54c5663 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Fri, 16 Jun 2023 13:43:02 +0200 Subject: [PATCH 51/55] add create conv when add friend --- containers/api/src/app.controller.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index c5beab79..e48629d5 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -14,6 +14,7 @@ import { generate } from 'rxjs'; import { generateOTP } from './users/2fa'; import { VerifyOTP } from './users/2fa'; import { ValidateOTP } from './users/2fa'; +import { privateDecrypt } from 'crypto'; //2fa @@ -82,6 +83,27 @@ export class AppController { const user = await this.userService.findOne(req.user.username) if (!user) return (0); + //create personnal conv for user + //await this.userService.addFriend(user, data.username); + + + + // const amIhere = data.members.includes(req.user.username); + // if (!amIhere) + const conv = { + id: null, + name: req.user.username + ", " + data.username, + banned: null, + admin: null, + messages: null, + members: [], + owner: req.user.username, + group: false, + }; + conv.members.push(req.user.username); + conv.members.push(data.username); + await this.chatService.createConv(conv); + return await this.userService.addFriend(user, data.username); } @@ -368,6 +390,7 @@ export class AppController { data.members.push(req.user.username) // let test = {id: 2, members: "cc"}; data.owner = req.user.username + data.group = true; return await this.chatService.createConv(data); // res.json(messages); } From 5b1a1487e1a24e9433fc145ffbaed12c2a4e6ba8 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 17 Jun 2023 02:08:55 +0200 Subject: [PATCH 52/55] add working ban, invite, mute, admin, change name/pass. no verified perm, reset the add friend/ban user to when it worked --- .env | 6 +- containers/api/src/app.controller.ts | 60 ++- containers/api/src/chat/chat.service.ts | 131 ++++--- containers/api/src/model/chat.entity.ts | 21 + containers/api/src/users/users.service.ts | 12 + containers/react/.env | 2 +- .../src/components/Messages/Chats copy.jsx | 362 ++++++++++++++++++ .../react/src/components/Messages/Chats.jsx | 87 ++--- .../src/components/Messages/ModalSetting.jsx | 230 +++++++++++ containers/react/src/pages/Home.js | 2 +- containers/react/src/styles/Messages.css | 56 ++- containers/react/src/styles/Win_Loss.css | 4 + 12 files changed, 845 insertions(+), 128 deletions(-) create mode 100644 containers/react/src/components/Messages/Chats copy.jsx create mode 100644 containers/react/src/components/Messages/ModalSetting.jsx diff --git a/.env b/.env index 4b96a475..aae0c767 100644 --- a/.env +++ b/.env @@ -14,9 +14,9 @@ NGINX_ENVSUBST_TEMPLATE_SUFFIX=".conf" # BASE_URL=http://localhost -BASE_URL=92.143.191.152 -REACT_APP_BASE_URL=92.143.191.152 -REDIRECT_URI=http://92.143.191.152/api/auth/login +BASE_URL=localhost +REACT_APP_BASE_URL=localhost +REDIRECT_URI=http://localhost/api/auth/login #postgres var # POSTGRES_HOST=127.0.0.1 # DB_TYPE=postgres diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index 14046904..e396be5b 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* app.controller.ts :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 01:00:00 by apommier #+# #+# */ +/* Updated: 2023/06/17 01:47:43 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + import { Controller, Request, Req, Get, Post, UseGuards, Redirect, Res, Body, UploadedFile, UseInterceptors} from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; @@ -93,12 +105,16 @@ export class AppController { const conv = { id: null, name: req.user.username + ", " + data.username, - banned: null, - admin: null, - messages: null, + banned: [], + admin: [], + muted: [], members: [], owner: req.user.username, + password: null, + messages: null, group: false, + private: false, + }; conv.members.push(req.user.username); conv.members.push(data.username); @@ -441,4 +457,42 @@ export class AppController { // res.json(messages); } + @Post('/ban') + async banUser(@Body() data: any) { + return await this.chatService.banUser(data.convId, data.username) + } + + @Post('/name') + async setName(@Body() data: any) { + //find conv + // data.convId + return await this.chatService.setName(data.convId, data.name) + } + + @Post('/invite') + async inviteUser(@Body() data: any) { + return await this.chatService.inviteUser(data.convId, data.username) + } + + @Post('/password') + async setPassword(@Body() data: any) { + return await this.chatService.setPassword(data.convId, data.password) + } + + @Post('/admin') + async setAdmin(@Body() data: any) { + return await this.chatService.setAdmin(data.convId, data.username) + } + + @Post('/mute') + async muteUser(@Body() data: any) { + return await this.chatService.muteUser(data.convId, data.username) + } + + @Post('/private') + async setPrivate(@Body() data: any) { + return await this.chatService.setPrivate(data.convId) + } + + } \ No newline at end of file diff --git a/containers/api/src/chat/chat.service.ts b/containers/api/src/chat/chat.service.ts index 5cfa25a3..ed91847a 100644 --- a/containers/api/src/chat/chat.service.ts +++ b/containers/api/src/chat/chat.service.ts @@ -1,7 +1,14 @@ -// import { Injectable } from '@nestjs/common'; - -// @Injectable() -// export class ConvService {} +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* chat.service.ts :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 01:00:25 by apommier #+# #+# */ +/* Updated: 2023/06/17 01:48:15 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; @@ -11,6 +18,7 @@ import { Message } from '../model/chat.entity'; import { ArrayContains } from "typeorm" import { query } from 'express'; +import { InitializeOnPreviewAllowlist } from '@nestjs/core'; @Injectable() @@ -19,17 +27,14 @@ export class ChatService { @InjectRepository(Message) private messageRepository: Repository, ) {} + async save(conv: Conv): Promise { + return await this.chatRepository.save(conv); +} + async createConv(conv: Conv): Promise { return await this.chatRepository.save(conv); } - - -// SELECT "conv"."id" AS "conv_id", "conv"."members" AS "conv_members", "conv"."name" AS "conv_name", "conv"."banned" AS "conv_banned", "conv"."admin" AS "conv_admin", "conv"."messages" AS "conv_messages" FROM "conv" "conv" WHERE $1 = ANY("conv"."members") - - -// import { createConnection } from 'typeorm'; - async getConv(username: string): Promise{ // username = "apommier" const convs = await this.chatRepository.query("SELECT * FROM \"conv\" WHERE $1 = ANY (ARRAY[members]);", [username]) @@ -44,56 +49,76 @@ async findConv(number: number){ return conv; } -// Usage -// const user = 'user1'; -// findConvsContainingUser(user) -// .then((convs) => { -// console.log('Convs containing user:', convs); -// }) -// .catch((error) => { -// console.error('Error:', error); -// }); - // return await this.chatRepository.findOneBy({ - // members: { $in: [username] }, - // }); - - // return await this.chatRepository.find() - - - // return await this.chatRepository.findOneBy({ - // members: ArrayContains(["apommier"]), - // }) - - // console.log(`get conv username= ${username} `) - // let test = await this.chatRepository.find({ - // where : { - // members: { $all: ["apommier"] }, - // }}) - // console.log(`test= ${test}`) - // return test -// } - - - - - -// -// message -// - async createMessage(message: Message): Promise { return await this.messageRepository.save(message); } async getMessages(convId: number): Promise { -// return await this.messageRepository.find({ -// where: { -// convId: convId, -// }, -// }); const convs = await this.chatRepository .query("SELECT * FROM \"message\" WHERE $1 = message.convid;", [convId]) return (convs) } + +async banUser(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.banned = conv.banned || []; + if (conv.banned.find(item => item === username)) + return (1); + conv.banned.push(username); + this.save(conv); +} + +async inviteUser(convId: number, username: string) { + // const conv = await this.findConv(convId); + // this.save(conv); + + //find user + //add in chanInvite chanID + //save user +} + +async setPassword(convId: number, password: string) { + //verify is user is admin ? + const conv = await this.findConv(convId); + conv.password = password + this.save(conv); +} + +async muteUser(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.muted = conv.muted || []; + if (conv.muted.find(item => item === username)) + return (1); + conv.muted.push(username); + this.save(conv); +} + +async setAdmin(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.admin = conv.admin || []; + if (conv.admin.find(item => item === username)) + return (1); + conv.admin.push(username); + this.save(conv); +} + +async setPrivate(convId: number) { + const conv = await this.findConv(convId); + if (conv.private === true) + conv.private = false; + else + conv.private = true; + this.save(conv); +} + +async setName(convId: number, name: string) { + const conv = await this.findConv(convId); + conv.name = name; + this.save(conv); +} + } diff --git a/containers/api/src/model/chat.entity.ts b/containers/api/src/model/chat.entity.ts index eb483c35..b81950d6 100644 --- a/containers/api/src/model/chat.entity.ts +++ b/containers/api/src/model/chat.entity.ts @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* chat.entity.ts :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 01:00:20 by apommier #+# #+# */ +/* Updated: 2023/06/17 01:31:29 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, BaseEntity } from 'typeorm'; @Entity() @@ -14,17 +26,26 @@ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, BaseEntity } @Column({ nullable: true }) group: boolean + @Column({ nullable: true }) + private: boolean + // @Column() // members: string;// arry ??? one to many ??? @Column('text', { array: true, nullable: true }) banned: string[]; + @Column('text', { array: true, nullable: true }) + muted: string[]; + @Column('text', { array: true, nullable: true }) admin: string[]; @Column({ nullable: true }) owner: string; + + @Column({ nullable: true }) + password: string; @Column({ nullable: true }) messages: string; diff --git a/containers/api/src/users/users.service.ts b/containers/api/src/users/users.service.ts index 5b596874..45a9e1e4 100644 --- a/containers/api/src/users/users.service.ts +++ b/containers/api/src/users/users.service.ts @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* users.service.ts :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 01:00:07 by apommier #+# #+# */ +/* Updated: 2023/06/17 01:00:08 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; diff --git a/containers/react/.env b/containers/react/.env index 164f6aa7..3b0e2b83 100644 --- a/containers/react/.env +++ b/containers/react/.env @@ -1,2 +1,2 @@ -REACT_APP_BASE_URL=92.143.191.152 +REACT_APP_BASE_URL=localhost # REACT_APP_BASE_URL=192.168.1.19 \ No newline at end of file diff --git a/containers/react/src/components/Messages/Chats copy.jsx b/containers/react/src/components/Messages/Chats copy.jsx new file mode 100644 index 00000000..56b7c017 --- /dev/null +++ b/containers/react/src/components/Messages/Chats copy.jsx @@ -0,0 +1,362 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* Chats.jsx :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 00:59:57 by apommier #+# #+# */ +/* Updated: 2023/06/17 01:24:24 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +import React, { useState, useEffect, useRef } from "react"; +import io from 'socket.io-client'; +import '../../styles/Messages.css' +import styled from "styled-components"; +import DefaultPic from '../../assets/profile.jpg' +import api from '../../script/axiosApi'; +import { motion , AnimatePresence} from "framer-motion"; +import Modal from "./Modal"; + +import Message from "./Message" +// import Input from "./Input"; + +//react icons +import { TbSend } from 'react-icons/tb'; +import { ImBlocked } from 'react-icons/im'; +import { MdOutlineGroupAdd } from 'react-icons/md'; +import { GrAdd } from 'react-icons/gr'; +import { RiListSettingsLine } from 'react-icons/ri' + +import { Rank } from "../../DataBase/DataRank"; +import GreenAlert from "../Alert/GreenAlert"; +import RedAlert from "../Alert/RedAlert"; +import YellowAlert from "../Alert/YellowAlert"; +import ModalSetting from "./ModalSetting"; + + +const TouchDiv = styled.div` + margin-left: 10px; + margin-right: 4px; + margin-bottom: 21px; + margin-top: 21px; + cursor: pointer; + justify-content: space-around; + + &:hover { + color: #F4F3EF; + } +` + +const UserChat = styled.div ` + padding: 5px; + display: flex; + align-items: center; + gap: 5px; + color: white; + cursor: pointer; + + &:hover{ + background-color: #3e3c61; + } + &:active { + filter: black; + } +` + +// const SideSpan = styled.span` +// font-size: 18px; +// font-weight: 500; +// ` + +const SideP = styled.p` + font-size: 14px; + color: lightgray; + margin-left: 15px; +` + +//======================================================================================================== +//======================================================================================================== +// Logical part +//======================================================================================================== +//======================================================================================================== + + +function Chats(){ + + const [isLoading, setIsLoading] = useState(true); + const [conversations, setConversation] = useState([]); + const [user, setUser] = useState(null); + const [currentChat, setCurrentChat] = useState(false); // false is good? + const [messages, setMessage] = useState([]); + const [newMessages, setNewMessage] = useState(""); + const [incomingMessage, setIncomingMessage] = useState(""); + const socket = useRef(); + + useEffect(()=> { + + const getConv = async ()=>{ + try{ + const convs = await api.get("/conv") + const tmpUser = await api.get("/profile") + console.log(convs); + setUser(tmpUser.data); + setConversation(convs.data); + // return tmpUser; + + + // console.log(`user= ${tmpUser.data.username}`); + // console.log(`user= ${tmpUser.data.nickname}`); + // console.log(`user= ${tmpUser.data}`); + socket.current = io("ws://localhost:4001"); + console.log(`connection....`); + socket.current.emit('connection', {username: tmpUser.data.username}) + // const socket = io("http://localhost:4001", { + // query: { + // username: user.username, + // },}); + socket.current.on('message', (data) => { //data should be a message ? + console.log(`message received data= ${data.sender}`) + console.log(`message received data= ${data.convId}`) + console.log(`message received data= ${data.sender}`) + console.log(`current chat = ${currentChat}`) + setIncomingMessage(data); + }); + setIsLoading(false) + + } + catch(err){ + console.log(err); + } + }; + getConv(); + + }, []) + + useEffect(()=> { + if (currentChat) + console.log(currentChat.id) + // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) + if (currentChat !== null && currentChat.id === incomingMessage.convId) + setMessage((prev) => [...prev, incomingMessage]); + }, [incomingMessage, currentChat]) + + useEffect(()=> { + const getMessage = async ()=> + { + const data = {convId: currentChat.id}; + + try { + const res = await api.post('/getMessage', data); + setMessage(res.data); + } catch(err) { + + } + } + getMessage(); + }, [currentChat]); + + const handleSubmit = async (e)=>{ + e.preventDefault(); + // console.log(`e= ${e.key}`) + // console.log(`name= ${user.username}`) + const message = { + sender: user.username, + text: newMessages, + convId: currentChat.id, + members: null + }; + try{ + console.log(`id= ${currentChat.id}`) + const res = await api.post('/message', message); + const convMember = await api.post('/member', message); + message.members = convMember.data.members; + console.log(convMember); + // console.log(`currentChat= ${currentChat.id}`) + + setMessage([...messages, res.data]); + setNewMessage(""); + socket.current.emit('sendMessage', message); + } + catch(err){ + console.log(err) + } + } + + const handleKeyPress = async (e)=>{ + // console.log(`e in press= ${e.key}`) + if (e.key !== "Enter") + return ; + // console.log(`name= ${user.username}`) + const message = { + sender: user.username, + text: newMessages, + convId: currentChat.id, + members: null + }; + try{ + console.log(`id= ${currentChat.id}`) + const res = await api.post('/message', message); + const convMember = await api.post('/member', message); + message.members = convMember.data.members; + console.log(convMember); + // console.log(`currentChat= ${currentChat.id}`) + + setMessage([...messages, res.data]); + setNewMessage(""); + socket.current.emit('sendMessage', message); + } + catch(err){ + console.log(err) + } + } + + const [friend, setFriend] = useState(""); + const [modalOpen, setModalOpen] = useState(false); + const [addFriend, setAddFriend] = useState(false); + const [block, setBlock] = useState(false); + const [setting, setSetting] = useState(false); + const close = () => setModalOpen(false); + const open = () => setModalOpen(true); + const closeAddFriend = () => setAddFriend(false); + const closeBlock = () => setBlock(false); + const closeSetting = () => setSetting(false); + + + const handleFriend = e => { + setFriend(e.target.value) + }; + + +//======================================================================================================== +//======================================================================================================== +// HTML +//======================================================================================================== +//======================================================================================================== + + + return ( +
+ +
+ profile + + {isLoading ? ( +

Loading...

+ ) : ( +

{user.nickname}

+ )} +
+
+ + + (addFriend ? setAddFriend(false) : setAddFriend(true))}> + + {/* {console.log("find = ",find) && setFind(true)} */} + + null} + > + {addFriend && } + + {/* {console.log("find2 = ", find) && find && } */} + + + (block ? setBlock(false) : setBlock(true))} + > + + null} + > + {block && } + + + + {currentChat ? ( + + + (setting ? setSetting(false) : setSetting(true))} + > + + null} + > + {setting && } + + + + ):("")} +
+
+
+
+ + + (modalOpen ? close() : open())} + > + + New Conversation + + {modalOpen && } + + + {conversations.map((c, index ) => { + return ( +
setCurrentChat(c)}> + + User +
+ {c.name} + Desc? +
+
+
+ + )})} +
+ + { + currentChat ? ( + <> +
+
+ {messages.map(m=>( + + ))} +
+ {/* */} +
+ setNewMessage(e.target.value)} + value={newMessages} + /> +
+ +
+
+
+ + ) : ( +
+ Open a conversation +
+ )} +
+
+ //
+ ); +} + +export default Chats \ No newline at end of file diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index 286c46ee..279ae749 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -15,11 +15,13 @@ import { TbSend } from 'react-icons/tb'; import { ImBlocked } from 'react-icons/im'; import { MdOutlineGroupAdd } from 'react-icons/md'; import { GrAdd } from 'react-icons/gr'; +import { RiListSettingsLine } from 'react-icons/ri' import { Rank } from "../../DataBase/DataRank"; import GreenAlert from "../Alert/GreenAlert"; import RedAlert from "../Alert/RedAlert"; import YellowAlert from "../Alert/YellowAlert"; +import ModalSetting from "./ModalSetting"; const TouchDiv = styled.div` @@ -80,14 +82,7 @@ function Chats(){ const [incomingMessage, setIncomingMessage] = useState(""); const socket = useRef(); - // Socket handler - // socket.on('message', (data) => { //data should be a message ? - // console.log(`message received data= ${data}`) - // setMessage([...messages, data]); - // }); - - //End of socket handler useEffect(()=> { @@ -98,19 +93,9 @@ function Chats(){ console.log(convs); setUser(tmpUser.data); setConversation(convs.data); - // return tmpUser; - - - // console.log(`user= ${tmpUser.data.username}`); - // console.log(`user= ${tmpUser.data.nickname}`); - // console.log(`user= ${tmpUser.data}`); socket.current = io('http://' + process.env.REACT_APP_BASE_URL + ':4001'); console.log(`connection....`); socket.current.emit('connection', {username: tmpUser.data.username}) - // const socket = io("http://localhost:4001", { - // query: { - // username: user.username, - // },}); socket.current.on('message', (data) => { //data should be a message ? console.log(`message received data= ${data.sender}`) console.log(`message received data= ${data.convId}`) @@ -137,23 +122,6 @@ function Chats(){ setMessage((prev) => [...prev, incomingMessage]); }, [incomingMessage, currentChat]) - // useEffect(()=> { - - // const getConv = async ()=>{ - // try{ - // const convs = await api.get("/conv") - // const tmpUser = await api.get("/profile") - // console.log(convs); - // setUser(tmpUser); - // setConversation(convs.data); - // } - // catch(err){ - // console.log(err); - // } - // }; - // getConv(); - // }, []) - useEffect(()=> { const getMessage = async ()=> { @@ -230,12 +198,16 @@ function Chats(){ const [modalOpen, setModalOpen] = useState(false); const [addFriend, setAddFriend] = useState(false); const [block, setBlock] = useState(false); - + const [showAddFriendAlert, setShowAddFriendAlert] = useState(false); const [showBlockAlert, setShowBlockAlert] = useState(false); - + + const [setting, setSetting] = useState(false); const close = () => setModalOpen(false); const open = () => setModalOpen(true); + // const closeAddFriend = () => setAddFriend(false); + // const closeBlock = () => setBlock(false); + const closeSetting = () => setSetting(false); // const closeAddFriend = () => setAddFriend(false); @@ -294,7 +266,6 @@ function Chats(){ setShowBlockAlert(false); }; - //======================================================================================================== //======================================================================================================== // HTML @@ -304,19 +275,6 @@ function Chats(){ return (
- {/*
- profile - - {isLoading ? ( -

Loading...

- ) : ( -

{user.nickname}

- //

{user.username}

- )} -
-
*/} - -
profile @@ -327,11 +285,6 @@ function Chats(){

{user.nickname}

)} - - - - {/* work here bitch */} - {/*
@@ -359,8 +312,25 @@ function Chats(){ + {currentChat ? ( + + + (setting ? setSetting(false) : setSetting(true))} + > + + null} + > + {setting && } + + + + ):("")}
*/} -
+ +
@@ -389,11 +359,6 @@ function Chats(){
- - - - -
diff --git a/containers/react/src/components/Messages/ModalSetting.jsx b/containers/react/src/components/Messages/ModalSetting.jsx new file mode 100644 index 00000000..95908493 --- /dev/null +++ b/containers/react/src/components/Messages/ModalSetting.jsx @@ -0,0 +1,230 @@ +import { motion } from "framer-motion"; +import Backdrop from "../Sidebar/Backdrop"; +import { Rank } from "../../DataBase/DataRank" +import '../../styles/Messages.css' +import { useState, useEffect } from "react"; +import { GrAdd } from "react-icons/gr"; +import { Link } from "react-router-dom"; +import api from "../../script/axiosApi"; + + +const dropIn = { + hidden:{y:"-100vh", + opacity: 0,}, + visible:{y: "0", + opacity: 0, + transotion:{ + duration:0.1, + type:"spring", + damping: 100, + stiffness: 500, + }}, + exit:{y: "100vh", + opacity: 0,}, + +}; + +const ModalSetting = ({handleClose, convId}) => { + const [password, setPassword] = useState(false); + const [users, setUsers] = useState([]); + const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); + const [selectedUser, setSelectedUser] = useState([]); + const [newName, setNewName] = useState(""); + const [newPassword, setNewPassword] = useState(""); + + useEffect(()=> { + + console.log("convid =", convId) + const getUsers = async ()=>{ + try { + const tmpUsers = await api.get("/users"); + console.log("users=", tmpUsers.data); + setUsers(tmpUsers.data); + } catch(err){ + console.log(err) + } + } + getUsers(); + }, []); + + // const [multi, setMulti] = useState(false); + // const [selectedOptionArray, setSelectedOptionArray] = useState([]); + + + const handleOptionChange = (selectId, selectedOption) => { + console.log("tag= ", selectTags) + console.log("option= ", selectedOption) + setSelectTag((prevTags) => + prevTags.map((tag) => + tag.id === selectId ? { ...tag, selectedOption } : tag + ) + ); + setSelectedUser(selectedOption) + }; + + const handleCheckPass = (e) => { + setPassword(e.target.checked); + console.log("password??", e.target.checked) + } + + const handleCheckPriv = (e) => { + // setPassword(e.target.checked); + if (e.target.checked) + { + console.log("chack true", e.target.checked) + try{ + api.post("/private", {convId: convId}) + } catch(err) { + console.log(err); + } + } + else + { + console.log("chack false", e.target.checked) + try{ + api.post("/private", {convId: convId}) + } catch(err) { + console.log(err); + } + } + } + + const handleName = async (e)=>{ + if (e.key !== "Enter") + return ; + try{ + api.post("/name", {convId: convId, name: newName}) + } catch(err) { + console.log(err); + } + handleClose(); + } + + const handlePassword = async (e)=>{ + if (e.key !== "Enter") + return ; + try{ + api.post("/password", {convId: convId, password: newPassword}) + } catch(err) { + console.log(err); + } + handleClose(); + } + + const handleBan = () => { + // console.log("ban option= ", selectedUser) + try{ + api.post("/ban", {convId: convId, username: selectedUser}) + } catch(err) { + console.log(err); + } + handleClose(); + }; + + const handleAdmin = () => { + try{ + api.post("/admin", {convId: convId, username: selectedUser}) + } catch(err) { + console.log(err); + } + handleClose(); + }; + + const handleMute = () => { + try{ + api.post("/mute", {convId: convId, username: selectedUser}) + } catch(err) { + console.log(err); + } + handleClose(); + }; + + const handleInvite = () => { + try{ + api.post("/invite", {convId: convId, username: selectedUser}) + } catch(err) { + console.log(err); + } + handleClose(); + }; + + return ( + + e.stopPropagation()} + className="modalSetting" + variant={dropIn} + initial="hidden" + animate="visible" + exit="exit" + > + +{/* First selection */} +
+
+

Private

+

Password

+ + + {password ? ( + setNewPassword(e.target.value)} + onKeyDown={handlePassword} + type="text" + className="in" + placeholder="Password"/> + ): + ("")} + + +
+
+ setNewName(e.target.value)} + onKeyDown={handleName} + type="text" + className="in" + placeholder="New Name" + /> +
+
+ +{/* Second selection */} + +
+ + + {selectTags.map((selectTag) => ( +
+ +
+ ))} + + +
+ Send + Ban + Mute + Admin +
+ +
+ +
+
+ ) +} + +export default ModalSetting \ No newline at end of file diff --git a/containers/react/src/pages/Home.js b/containers/react/src/pages/Home.js index 62cee02d..e0291b09 100644 --- a/containers/react/src/pages/Home.js +++ b/containers/react/src/pages/Home.js @@ -27,7 +27,7 @@ function HomeLogin() } // else // let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.REACT_APP_BASE_URL + "%3A80%2Fapi%2Fauth%2Flogin&response_type=code"; - let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F92.143.191.152%2Fapi%2Fauth%2Flogin&response_type=code" + let path = "https://api.intra.42.fr/oauth/authorize?client_id=u-s4t2ud-6d29dfa49ba7146577ffd8bf595ae8d9e5aaa3e0a9615df18777171ebf836a41&redirect_uri=http%3A%2F%2F" + process.env.REACT_APP_BASE_URL + "%2Fapi%2Fauth%2Flogin&response_type=code" window.location.replace(path); }; diff --git a/containers/react/src/styles/Messages.css b/containers/react/src/styles/Messages.css index 37c84b40..0d201718 100644 --- a/containers/react/src/styles/Messages.css +++ b/containers/react/src/styles/Messages.css @@ -1,5 +1,5 @@ .home{ - background-color: black; + background-color: rgb(0, 0, 0); height: 90vh; display: flex; align-items: center; @@ -38,6 +38,10 @@ select{ overflow: scroll; } +::-webkit-scrollbar{ + display:none; +} + .newMessage{ color: white; font-size: 18px; @@ -46,14 +50,14 @@ select{ .contact{ background-color: rgb(46, 46, 46); align-items: left; - height: 29.7rem; + height: 30.2rem; overflow: scroll; /* width: 2rem; */ /* height: 4rem; */ } .messages_box{ - background-color: black; + background-color: rgb(0, 0, 0); /* height: 90vh; */ display: flex; align-items: center; @@ -73,7 +77,7 @@ select{ .sidebar{ flex:1; border-right: 1px solid #3e3c61; - background-color: #060b26; + background-color: #a2a3ac; color: white; } @@ -95,6 +99,7 @@ select{ color: white; padding: 3px; border-radius: 10px 10px 0px 0px; + margin-top: 0px; } .pic{ @@ -122,9 +127,9 @@ select{ } .messages{ - background-color: black; + background-color: rgb(26, 26, 26); /* height: calc(100% - 118px); */ - width: 40rem; + width: 70%; overflow: scroll; } @@ -185,6 +190,7 @@ input{ font-size: 1.2rem; text-decoration: none; font-weight:lighter; + margin: 1%; } .div_submit { @@ -261,3 +267,41 @@ input{ color: rgba(255, 255, 255, 1); } +.modalSetting{ + width: clamp(50%, 700px, 90%); + height: min(50%, 300px); + + margin: auto; + padding: 2rem; + border-radius: 12px; + display: flex; + /* flex-direction: column; */ + /* align-items: center; */ + background-color: #3e3c61; +} + +.settingFirstPart{ + margin-top: 10%; + margin-left: 15%; +} + +.settingSecondPart{ + margin-top: 10%; + margin-left: 10%; + + /* margin-left: 20%; */ +} + +.checkbox{ + display:flex; + flex-direction:row; +} + +input.in{ + margin-top: 5%; + margin-left: 0px; + background-color: black; + color: white; + border-radius: 12px; + width: 70%; +} \ No newline at end of file diff --git a/containers/react/src/styles/Win_Loss.css b/containers/react/src/styles/Win_Loss.css index 068b1a68..fdb3df72 100644 --- a/containers/react/src/styles/Win_Loss.css +++ b/containers/react/src/styles/Win_Loss.css @@ -15,6 +15,10 @@ overflow: scroll; } +.scroll::-webkit-scrollbar{ + display:none; +} + .elements { /* display: flex; */ border-width:1px; From 49ddd86717d7a583e7baf65865e2ae0b6d9cded7 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 17 Jun 2023 19:11:40 +0200 Subject: [PATCH 53/55] add ban and mute effective, can invite, set password, set private --- containers/api/package-lock.json | 319 ++++++++++++++- containers/api/package.json | 2 + containers/api/src/app.controller.ts | 65 +++- containers/api/src/chat/chat.service.ts | 61 ++- .../src/components/Messages/Chats copy.jsx | 362 ------------------ .../react/src/components/Messages/Chats.jsx | 50 ++- .../react/src/components/Messages/Modal.jsx | 85 +++- 7 files changed, 535 insertions(+), 409 deletions(-) delete mode 100644 containers/react/src/components/Messages/Chats copy.jsx diff --git a/containers/api/package-lock.json b/containers/api/package-lock.json index 80ea8757..50aa6e88 100644 --- a/containers/api/package-lock.json +++ b/containers/api/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.4.0", "base32-decode": "^1.0.0", "base32-encode": "^2.0.0", + "bcrypt": "^5.1.0", "express-session": "^1.17.3", "hi-base32": "^0.5.1", "nanoid": "^3.3.4", @@ -38,6 +39,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": "29.5.0", "@types/node": "18.15.11", @@ -1425,6 +1427,39 @@ "node": ">=8" } }, + "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/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@nestjs/cli": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.4.2.tgz", @@ -2131,6 +2166,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", @@ -2734,6 +2778,11 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "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", @@ -2783,6 +2832,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": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2934,6 +2994,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.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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", @@ -3112,6 +3202,19 @@ } ] }, + "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", @@ -3186,7 +3289,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3418,6 +3520,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", @@ -3604,6 +3714,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", @@ -3633,8 +3751,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3655,6 +3772,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", @@ -3817,6 +3939,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/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3834,6 +3961,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", @@ -4761,6 +4896,33 @@ "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-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -4791,6 +4953,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/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4846,7 +5027,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4955,6 +5135,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", @@ -4998,6 +5183,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", @@ -6267,7 +6464,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" }, @@ -6282,7 +6478,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" } @@ -6405,7 +6600,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6430,6 +6624,34 @@ "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/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6521,6 +6743,11 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "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", @@ -6560,6 +6787,20 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "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", @@ -6581,6 +6822,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/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6871,7 +7123,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7962,8 +8213,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", @@ -8061,7 +8311,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -8219,6 +8468,46 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "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/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/terser": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", @@ -9098,6 +9387,14 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, + "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", diff --git a/containers/api/package.json b/containers/api/package.json index fdad87d1..bba9ac06 100644 --- a/containers/api/package.json +++ b/containers/api/package.json @@ -30,6 +30,7 @@ "axios": "^1.4.0", "base32-decode": "^1.0.0", "base32-encode": "^2.0.0", + "bcrypt": "^5.1.0", "express-session": "^1.17.3", "hi-base32": "^0.5.1", "nanoid": "^3.3.4", @@ -49,6 +50,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": "29.5.0", "@types/node": "18.15.11", diff --git a/containers/api/src/app.controller.ts b/containers/api/src/app.controller.ts index e396be5b..8c6949b1 100644 --- a/containers/api/src/app.controller.ts +++ b/containers/api/src/app.controller.ts @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/17 01:00:00 by apommier #+# #+# */ -/* Updated: 2023/06/17 01:47:43 by apommier ### ########.fr */ +/* Updated: 2023/06/17 17:29:05 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -419,7 +419,13 @@ export class AppController { return await this.chatService.getConv(req.user.username); } -// @UseGuards(JwtAuthGuard) + @UseGuards(JwtAuthGuard) + @Get('/convs') + async getConvs() { + return await this.chatService.findAll(); + } + + @UseGuards(JwtAuthGuard) @Post('/message') async postMessage(@Request() req, @Body() data: any) { //if i can post post ? @@ -432,16 +438,18 @@ export class AppController { id: null, } console.log(data); - return await this.chatService.createMessage(message); + return await this.chatService.createMessage(message, req.user.username); } - + + @UseGuards(JwtAuthGuard) @Post('/member') async getMember(@Body() data: any) { console.log(data); console.log(`get member= ${data.convId}`); return await this.chatService.findConv(data.convId); } - + + @UseGuards(JwtAuthGuard) @Post('/getMessage') async getMessage(@Body() data: any) { console.log(data); @@ -455,44 +463,75 @@ export class AppController { // res.json(messages); - } - + } + + @UseGuards(JwtAuthGuard) @Post('/ban') async banUser(@Body() data: any) { return await this.chatService.banUser(data.convId, data.username) } - + + @UseGuards(JwtAuthGuard) @Post('/name') async setName(@Body() data: any) { //find conv // data.convId return await this.chatService.setName(data.convId, data.name) } - + + @UseGuards(JwtAuthGuard) @Post('/invite') async inviteUser(@Body() data: any) { return await this.chatService.inviteUser(data.convId, data.username) } - + + @UseGuards(JwtAuthGuard) @Post('/password') async setPassword(@Body() data: any) { return await this.chatService.setPassword(data.convId, data.password) } - + + @UseGuards(JwtAuthGuard) + @Post('/verifyPassword') + async verifyPassword(@Body() data: any) { + return await this.chatService.verifyPassword(data.convId, data.password) + } + + @UseGuards(JwtAuthGuard) @Post('/admin') async setAdmin(@Body() data: any) { return await this.chatService.setAdmin(data.convId, data.username) } - + + @UseGuards(JwtAuthGuard) + @Post('/isAdmin') + async isAdmin(@Request() req, @Body() data: any) { + console.log("isdamin= ", req.user.username, " id=", data.convId) + return await this.chatService.isAdmin(data.convId, req.user.username) + } + + @UseGuards(JwtAuthGuard) @Post('/mute') async muteUser(@Body() data: any) { return await this.chatService.muteUser(data.convId, data.username) } - + + @UseGuards(JwtAuthGuard) @Post('/private') async setPrivate(@Body() data: any) { return await this.chatService.setPrivate(data.convId) } + @UseGuards(JwtAuthGuard) + @Post('/allowed') + async isAllowed(@Request() req, @Body() data: any) { + return await this.chatService.isAllowed(data.convId, req.user.username) + } + + @UseGuards(JwtAuthGuard) + @Post('/join') + async joinChannel(@Request() req, @Body() data: any) { + return await this.chatService.joinChannel(data.convId, req.user.username) + } } \ No newline at end of file diff --git a/containers/api/src/chat/chat.service.ts b/containers/api/src/chat/chat.service.ts index ed91847a..53a4c50f 100644 --- a/containers/api/src/chat/chat.service.ts +++ b/containers/api/src/chat/chat.service.ts @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/17 01:00:25 by apommier #+# #+# */ -/* Updated: 2023/06/17 01:48:15 by apommier ### ########.fr */ +/* Updated: 2023/06/17 17:31:11 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,8 @@ import { Repository } from 'typeorm'; import { Conv } from '../model/chat.entity'; import { Message } from '../model/chat.entity'; +import * as bcrypt from 'bcrypt'; + import { ArrayContains } from "typeorm" import { query } from 'express'; import { InitializeOnPreviewAllowlist } from '@nestjs/core'; @@ -31,6 +33,10 @@ export class ChatService { return await this.chatRepository.save(conv); } +async findAll(): Promise { + return await this.chatRepository.find(); +} + async createConv(conv: Conv): Promise { return await this.chatRepository.save(conv); } @@ -49,8 +55,22 @@ async findConv(number: number){ return conv; } - async createMessage(message: Message): Promise { - return await this.messageRepository.save(message); + async createMessage(message: Message, username: string): Promise { + const conv = await this.findConv(message.convid); + if (conv.banned.find(item => item === username)) + return ; + if (conv.muted.find(item => item === username)) + return ; + return await this.messageRepository.save(message); + } + + async isAllowed(convId: number, username: string) { + const conv = await this.findConv(convId); + if (conv.banned.find(item => item === username)) + return (0); + if (conv.muted.find(item => item === username)) + return (0); + return (1); } async getMessages(convId: number): Promise { @@ -79,13 +99,26 @@ async inviteUser(convId: number, username: string) { //save user } + + async setPassword(convId: number, password: string) { //verify is user is admin ? const conv = await this.findConv(convId); - conv.password = password + const saltRounds = 10; + const hashedPassword = await bcrypt.hash(password, saltRounds); + // return hashedPassword; + conv.password = hashedPassword this.save(conv); } +async verifyPassword(convId: number, password: string) { + //verify is user is admin ? + const conv = await this.findConv(convId); + return await bcrypt.compare(password, conv.password); + + // conv.password = password +} + async muteUser(convId: number, username: string) { const conv = await this.findConv(convId); @@ -106,6 +139,16 @@ async setAdmin(convId: number, username: string) { this.save(conv); } +async isAdmin(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.admin = conv.admin || []; + if (conv.admin.find(item => item === username)) + return (1); + console.log("nope"); + return (0); +} + async setPrivate(convId: number) { const conv = await this.findConv(convId); if (conv.private === true) @@ -121,4 +164,14 @@ async setName(convId: number, name: string) { this.save(conv); } +async joinChannel(convId: number, username: string) { + const conv = await this.findConv(convId); + conv.members = conv.members || []; + if (conv.members.find(item => item === username)) + return ; + conv.members.push(username); + // conv.name = name; + this.save(conv); +} + } diff --git a/containers/react/src/components/Messages/Chats copy.jsx b/containers/react/src/components/Messages/Chats copy.jsx deleted file mode 100644 index 56b7c017..00000000 --- a/containers/react/src/components/Messages/Chats copy.jsx +++ /dev/null @@ -1,362 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* Chats.jsx :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: apommier +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2023/06/17 00:59:57 by apommier #+# #+# */ -/* Updated: 2023/06/17 01:24:24 by apommier ### ########.fr */ -/* */ -/* ************************************************************************** */ - -import React, { useState, useEffect, useRef } from "react"; -import io from 'socket.io-client'; -import '../../styles/Messages.css' -import styled from "styled-components"; -import DefaultPic from '../../assets/profile.jpg' -import api from '../../script/axiosApi'; -import { motion , AnimatePresence} from "framer-motion"; -import Modal from "./Modal"; - -import Message from "./Message" -// import Input from "./Input"; - -//react icons -import { TbSend } from 'react-icons/tb'; -import { ImBlocked } from 'react-icons/im'; -import { MdOutlineGroupAdd } from 'react-icons/md'; -import { GrAdd } from 'react-icons/gr'; -import { RiListSettingsLine } from 'react-icons/ri' - -import { Rank } from "../../DataBase/DataRank"; -import GreenAlert from "../Alert/GreenAlert"; -import RedAlert from "../Alert/RedAlert"; -import YellowAlert from "../Alert/YellowAlert"; -import ModalSetting from "./ModalSetting"; - - -const TouchDiv = styled.div` - margin-left: 10px; - margin-right: 4px; - margin-bottom: 21px; - margin-top: 21px; - cursor: pointer; - justify-content: space-around; - - &:hover { - color: #F4F3EF; - } -` - -const UserChat = styled.div ` - padding: 5px; - display: flex; - align-items: center; - gap: 5px; - color: white; - cursor: pointer; - - &:hover{ - background-color: #3e3c61; - } - &:active { - filter: black; - } -` - -// const SideSpan = styled.span` -// font-size: 18px; -// font-weight: 500; -// ` - -const SideP = styled.p` - font-size: 14px; - color: lightgray; - margin-left: 15px; -` - -//======================================================================================================== -//======================================================================================================== -// Logical part -//======================================================================================================== -//======================================================================================================== - - -function Chats(){ - - const [isLoading, setIsLoading] = useState(true); - const [conversations, setConversation] = useState([]); - const [user, setUser] = useState(null); - const [currentChat, setCurrentChat] = useState(false); // false is good? - const [messages, setMessage] = useState([]); - const [newMessages, setNewMessage] = useState(""); - const [incomingMessage, setIncomingMessage] = useState(""); - const socket = useRef(); - - useEffect(()=> { - - const getConv = async ()=>{ - try{ - const convs = await api.get("/conv") - const tmpUser = await api.get("/profile") - console.log(convs); - setUser(tmpUser.data); - setConversation(convs.data); - // return tmpUser; - - - // console.log(`user= ${tmpUser.data.username}`); - // console.log(`user= ${tmpUser.data.nickname}`); - // console.log(`user= ${tmpUser.data}`); - socket.current = io("ws://localhost:4001"); - console.log(`connection....`); - socket.current.emit('connection', {username: tmpUser.data.username}) - // const socket = io("http://localhost:4001", { - // query: { - // username: user.username, - // },}); - socket.current.on('message', (data) => { //data should be a message ? - console.log(`message received data= ${data.sender}`) - console.log(`message received data= ${data.convId}`) - console.log(`message received data= ${data.sender}`) - console.log(`current chat = ${currentChat}`) - setIncomingMessage(data); - }); - setIsLoading(false) - - } - catch(err){ - console.log(err); - } - }; - getConv(); - - }, []) - - useEffect(()=> { - if (currentChat) - console.log(currentChat.id) - // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) - if (currentChat !== null && currentChat.id === incomingMessage.convId) - setMessage((prev) => [...prev, incomingMessage]); - }, [incomingMessage, currentChat]) - - useEffect(()=> { - const getMessage = async ()=> - { - const data = {convId: currentChat.id}; - - try { - const res = await api.post('/getMessage', data); - setMessage(res.data); - } catch(err) { - - } - } - getMessage(); - }, [currentChat]); - - const handleSubmit = async (e)=>{ - e.preventDefault(); - // console.log(`e= ${e.key}`) - // console.log(`name= ${user.username}`) - const message = { - sender: user.username, - text: newMessages, - convId: currentChat.id, - members: null - }; - try{ - console.log(`id= ${currentChat.id}`) - const res = await api.post('/message', message); - const convMember = await api.post('/member', message); - message.members = convMember.data.members; - console.log(convMember); - // console.log(`currentChat= ${currentChat.id}`) - - setMessage([...messages, res.data]); - setNewMessage(""); - socket.current.emit('sendMessage', message); - } - catch(err){ - console.log(err) - } - } - - const handleKeyPress = async (e)=>{ - // console.log(`e in press= ${e.key}`) - if (e.key !== "Enter") - return ; - // console.log(`name= ${user.username}`) - const message = { - sender: user.username, - text: newMessages, - convId: currentChat.id, - members: null - }; - try{ - console.log(`id= ${currentChat.id}`) - const res = await api.post('/message', message); - const convMember = await api.post('/member', message); - message.members = convMember.data.members; - console.log(convMember); - // console.log(`currentChat= ${currentChat.id}`) - - setMessage([...messages, res.data]); - setNewMessage(""); - socket.current.emit('sendMessage', message); - } - catch(err){ - console.log(err) - } - } - - const [friend, setFriend] = useState(""); - const [modalOpen, setModalOpen] = useState(false); - const [addFriend, setAddFriend] = useState(false); - const [block, setBlock] = useState(false); - const [setting, setSetting] = useState(false); - const close = () => setModalOpen(false); - const open = () => setModalOpen(true); - const closeAddFriend = () => setAddFriend(false); - const closeBlock = () => setBlock(false); - const closeSetting = () => setSetting(false); - - - const handleFriend = e => { - setFriend(e.target.value) - }; - - -//======================================================================================================== -//======================================================================================================== -// HTML -//======================================================================================================== -//======================================================================================================== - - - return ( -
- -
- profile - - {isLoading ? ( -

Loading...

- ) : ( -

{user.nickname}

- )} -
-
- - - (addFriend ? setAddFriend(false) : setAddFriend(true))}> - - {/* {console.log("find = ",find) && setFind(true)} */} - - null} - > - {addFriend && } - - {/* {console.log("find2 = ", find) && find && } */} - - - (block ? setBlock(false) : setBlock(true))} - > - - null} - > - {block && } - - - - {currentChat ? ( - - - (setting ? setSetting(false) : setSetting(true))} - > - - null} - > - {setting && } - - - - ):("")} -
-
-
-
- - - (modalOpen ? close() : open())} - > - - New Conversation - - {modalOpen && } - - - {conversations.map((c, index ) => { - return ( -
setCurrentChat(c)}> - - User -
- {c.name} - Desc? -
-
-
- - )})} -
- - { - currentChat ? ( - <> -
-
- {messages.map(m=>( - - ))} -
- {/* */} -
- setNewMessage(e.target.value)} - value={newMessages} - /> -
- -
-
-
- - ) : ( -
- Open a conversation -
- )} -
-
- //
- ); -} - -export default Chats \ No newline at end of file diff --git a/containers/react/src/components/Messages/Chats.jsx b/containers/react/src/components/Messages/Chats.jsx index 279ae749..40d181dc 100644 --- a/containers/react/src/components/Messages/Chats.jsx +++ b/containers/react/src/components/Messages/Chats.jsx @@ -77,6 +77,8 @@ function Chats(){ const [conversations, setConversation] = useState([]); const [user, setUser] = useState(null); const [currentChat, setCurrentChat] = useState(false); // false is good? + const [isAdmin, setIsAdmin] = useState(false); // false is good? + // const [currentChat, setCurrentChat] = useState(false); // false is good? const [messages, setMessage] = useState([]); const [newMessages, setNewMessage] = useState(""); const [incomingMessage, setIncomingMessage] = useState(""); @@ -115,11 +117,30 @@ function Chats(){ }, []) useEffect(()=> { - if (currentChat) - console.log(currentChat.id) - // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) - if (currentChat !== null && currentChat.id === incomingMessage.convId) - setMessage((prev) => [...prev, incomingMessage]); + + const updateChat = async ()=> { + // if (currentChat) + // console.log(currentChat.id) + if (currentChat) + { + + try { + const res = await api.post("/isAdmin", {convId: currentChat.id}) + console.log("isadmin= ", res.data) + setIsAdmin(res.data); + } catch (err) { + console.log(err); + } + } + // console.log(`result1 = ${currentChat.id !== incomingMessage.convId}`) + if (currentChat !== null && currentChat.id === incomingMessage.convId) + { + + setMessage((prev) => [...prev, incomingMessage]); + } + } + updateChat(); + }, [incomingMessage, currentChat]) useEffect(()=> { @@ -149,6 +170,10 @@ function Chats(){ }; try{ console.log(`id= ${currentChat.id}`) + const allowed = await api.post('/allowed', {convId: message.convId, username: user.username}); + console.log("allowed= ", allowed.data) + if (!allowed.data) + return ; const res = await api.post('/message', message); const convMember = await api.post('/member', message); message.members = convMember.data.members; @@ -358,6 +383,21 @@ function Chats(){ )} + {currentChat && isAdmin ? ( + + (setting ? setSetting(false) : setSetting(true))} + > + + null} + > + {setting && } + + + + ):("")}
diff --git a/containers/react/src/components/Messages/Modal.jsx b/containers/react/src/components/Messages/Modal.jsx index 0f32b24c..87a41fc2 100644 --- a/containers/react/src/components/Messages/Modal.jsx +++ b/containers/react/src/components/Messages/Modal.jsx @@ -28,14 +28,23 @@ const Modal = ({handleClose}) => { const [selectTags, setSelectTag] = useState([{ id: 1, selectedOption: ''}]); const [selectedOptionArray, setSelectedOptionArray] = useState([]); const [users, setUsers] = useState([]); + const [user, setUser] = useState(); + const [convs, setConvs] = useState([]); + + const [channel, setChannel] = useState(''); useEffect(()=> { const getConv = async ()=>{ try { const tmpUsers = await api.get("/users"); + const tmpUser = await api.get("/profile"); + const tmpConvs = await api.get("/convs"); console.log("users=", tmpUsers.data); + console.log("convs=", tmpConvs.data); setUsers(tmpUsers.data); + setUser(tmpUser.data); + setConvs(tmpConvs.data); } catch(err){ console.log(err) } @@ -58,6 +67,15 @@ const Modal = ({handleClose}) => { console.log(selectTags) }; + const joinChannel = async () => { + try { + console.log("channel= ", channel) + await api.post("/join", {convId: channel}) + } catch(err) { + console.log(err); + } + }; + const saveSelectedOptions = () => { // const selectedOptions = selectTags.map((tag) => tag.selectedOption); const selectedOptions = selectTags.map((tag) => tag.selectedOption).filter((option) => option !== ''); @@ -108,24 +126,63 @@ const Modal = ({handleClose}) => {
))} - -
-
-

Selected Option:

-
    - {selectedOptionArray.map((option, index) => ( -
  • {option}
  • - ))} -
-
-
- Submit +
+ Submit - Cancel -
+ Cancel +
+ + + + {convs.length > 0 && ( + + )} + +
+ Join +
+ + + {/* {selectTags.map((selectTag) => ( +
+ +
+ ))} */} + + + + {/*
+ +
*/} + From 7ae9e2ba788a815e8f20d2ec84a82b0abd85278e Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 17 Jun 2023 23:18:18 +0200 Subject: [PATCH 54/55] merge qrcode --- containers/api/src/chat/chat.service.ts | 177 ++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 containers/api/src/chat/chat.service.ts diff --git a/containers/api/src/chat/chat.service.ts b/containers/api/src/chat/chat.service.ts new file mode 100644 index 00000000..ef81132e --- /dev/null +++ b/containers/api/src/chat/chat.service.ts @@ -0,0 +1,177 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* chat.service.ts :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/06/17 01:00:25 by apommier #+# #+# */ +/* Updated: 2023/06/17 17:31:11 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Conv } from '../model/chat.entity'; +import { Message } from '../model/chat.entity'; + +import * as bcrypt from 'bcrypt'; + +import { ArrayContains } from "typeorm" +import { query } from 'express'; +import { InitializeOnPreviewAllowlist } from '@nestjs/core'; + + +@Injectable() +export class ChatService { + constructor(@InjectRepository(Conv) private chatRepository: Repository, + @InjectRepository(Message) private messageRepository: Repository, + ) {} + + async save(conv: Conv): Promise { + return await this.chatRepository.save(conv); +} + +async findAll(): Promise { + return await this.chatRepository.find(); +} + + async createConv(conv: Conv): Promise { + return await this.chatRepository.save(conv); + } + + async getConv(username: string): Promise{ + username = "sadjigui" + const convs = await this.chatRepository.query("SELECT * FROM \"conv\" WHERE $1 = ANY (ARRAY[members]);", [username]) + console.log(`convs= ${convs}`) + return convs; +} + +async findConv(number: number){ + // username = "apommier" + console.log(`fincConv; ${number}`) + const conv = await this.chatRepository.findOneBy({id: number}) + return conv; +} + + async createMessage(message: Message, username: string): Promise { + const conv = await this.findConv(message.convid); + if (conv.banned.find(item => item === username)) + return ; + if (conv.muted.find(item => item === username)) + return ; + return await this.messageRepository.save(message); + } + + async isAllowed(convId: number, username: string) { + const conv = await this.findConv(convId); + if (conv.banned.find(item => item === username)) + return (0); + if (conv.muted.find(item => item === username)) + return (0); + return (1); + } + + async getMessages(convId: number): Promise { + const convs = await this.chatRepository + .query("SELECT * FROM \"message\" WHERE $1 = message.convid;", [convId]) + + return (convs) +} + +async banUser(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.banned = conv.banned || []; + if (conv.banned.find(item => item === username)) + return (1); + conv.banned.push(username); + this.save(conv); +} + +async inviteUser(convId: number, username: string) { + // const conv = await this.findConv(convId); + // this.save(conv); + + //find user + //add in chanInvite chanID + //save user +} + + + +async setPassword(convId: number, password: string) { + //verify is user is admin ? + const conv = await this.findConv(convId); + const saltRounds = 10; + const hashedPassword = await bcrypt.hash(password, saltRounds); + // return hashedPassword; + conv.password = hashedPassword + this.save(conv); +} + +async verifyPassword(convId: number, password: string) { + //verify is user is admin ? + const conv = await this.findConv(convId); + return await bcrypt.compare(password, conv.password); + + // conv.password = password +} + +async muteUser(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.muted = conv.muted || []; + if (conv.muted.find(item => item === username)) + return (1); + conv.muted.push(username); + this.save(conv); +} + +async setAdmin(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.admin = conv.admin || []; + if (conv.admin.find(item => item === username)) + return (1); + conv.admin.push(username); + this.save(conv); +} + +async isAdmin(convId: number, username: string) { + const conv = await this.findConv(convId); + + conv.admin = conv.admin || []; + if (conv.admin.find(item => item === username)) + return (1); + console.log("nope"); + return (0); +} + +async setPrivate(convId: number) { + const conv = await this.findConv(convId); + if (conv.private === true) + conv.private = false; + else + conv.private = true; + this.save(conv); +} + +async setName(convId: number, name: string) { + const conv = await this.findConv(convId); + conv.name = name; + this.save(conv); +} + +async joinChannel(convId: number, username: string) { + const conv = await this.findConv(convId); + conv.members = conv.members || []; + if (conv.members.find(item => item === username)) + return ; + conv.members.push(username); + // conv.name = name; + this.save(conv); +} + +} From 439911dd2acd915553213d2b35472fa33e8b2726 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Sat, 17 Jun 2023 23:30:17 +0200 Subject: [PATCH 55/55] merge qrcode --- containers/api/src/chat/chat.service.ts | 3 +-- containers/react/package-lock.json | 17 ++--------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/containers/api/src/chat/chat.service.ts b/containers/api/src/chat/chat.service.ts index ef81132e..e592801e 100644 --- a/containers/api/src/chat/chat.service.ts +++ b/containers/api/src/chat/chat.service.ts @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/06/17 01:00:25 by apommier #+# #+# */ -/* Updated: 2023/06/17 17:31:11 by apommier ### ########.fr */ +/* Updated: 2023/06/17 23:28:11 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,7 +42,6 @@ async findAll(): Promise { } async getConv(username: string): Promise{ - username = "sadjigui" const convs = await this.chatRepository.query("SELECT * FROM \"conv\" WHERE $1 = ANY (ARRAY[members]);", [username]) console.log(`convs= ${convs}`) return convs; diff --git a/containers/react/package-lock.json b/containers/react/package-lock.json index 6d4d5b38..a0474a11 100644 --- a/containers/react/package-lock.json +++ b/containers/react/package-lock.json @@ -6141,7 +6141,6 @@ "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -7512,8 +7511,7 @@ "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -8843,7 +8841,6 @@ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.8.tgz", "integrity": "sha512-ylobYq3tGFjjAmRdBs5pL/R1+4AmOm69g/JbF5DcNETfRe8L9CjaX4acG83MjYdIsbsTGJmtR5qKx4glNmXO4A==", "dependencies": { - "@emotion/is-prop-valid": "^0.8.2", "tslib": "^2.4.0" }, "optionalDependencies": { @@ -10719,7 +10716,6 @@ "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^27.5.1", "jest-serializer": "^27.5.1", @@ -12276,7 +12272,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "graceful-fs": "^4.1.6", "universalify": "^2.0.0" }, "optionalDependencies": { @@ -13776,7 +13771,6 @@ "inBundle": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", "string-width": "^4.2.0" }, "engines": { @@ -14313,8 +14307,7 @@ "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" @@ -14600,7 +14593,6 @@ "inBundle": true, "license": "MIT", "dependencies": { - "encoding": "^0.1.13", "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" @@ -14980,7 +14972,6 @@ "inBundle": true, "license": "MIT", "dependencies": { - "encoding": "^0.1.13", "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" @@ -18329,7 +18320,6 @@ "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", - "fsevents": "^2.3.2", "html-webpack-plugin": "^5.5.0", "identity-obj-proxy": "^3.0.0", "jest": "^27.4.3", @@ -18766,9 +18756,6 @@ "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dependencies": { - "fsevents": "~2.3.2" - }, "bin": { "rollup": "dist/bin/rollup" },