diff --git a/front/dist/resources/html/gameLogin.html b/front/dist/resources/html/gameLogin.html index 98df47ea..5f751492 100644 --- a/front/dist/resources/html/gameLogin.html +++ b/front/dist/resources/html/gameLogin.html @@ -10,7 +10,7 @@ background: #eceeee; border: 1px solid #42464b; border-radius: 6px; - height: 257px; + height: 270px; margin: 20px auto 0; width: 298px; } diff --git a/front/dist/resources/html/gameMenuIcon.html b/front/dist/resources/html/gameMenuIcon.html index 75a52ac7..83cf225a 100644 --- a/front/dist/resources/html/gameMenuIcon.html +++ b/front/dist/resources/html/gameMenuIcon.html @@ -16,6 +16,7 @@ #menuIcon button img{ width: 14px; padding-top: 4px; + cursor: url('/resources/logos/cursor_pointer.png'), pointer; } #menuIcon section { margin: 10px; diff --git a/front/dist/resources/html/gameRegister.html b/front/dist/resources/html/gameRegister.html index 5be17a0c..d33fd7e1 100644 --- a/front/dist/resources/html/gameRegister.html +++ b/front/dist/resources/html/gameRegister.html @@ -112,6 +112,6 @@
- + Login
diff --git a/front/src/Connexion/ConnectionManager.ts b/front/src/Connexion/ConnectionManager.ts index fa09a046..446b1176 100644 --- a/front/src/Connexion/ConnectionManager.ts +++ b/front/src/Connexion/ConnectionManager.ts @@ -19,7 +19,7 @@ class ConnectionManager { private connectedUser?: ConnectedUser|null; constructor() { - this.verifyLoggedUser(); + //this.userLogin(); } /** @@ -119,17 +119,16 @@ class ConnectionManager { return this.connexionType; } - public verifyLoggedUser(){ + /** + * + * @param email + * @param password + */ + public userLogin(email: string, password: string){ //Verify spark session - Axios.get('http://admin.workadventure.localhost/user/connected').then((res) => { - console.log('res', res); - Axios.get('http://admin.workadventure.localhost/notifications/recent').then((res) => { - this.connectedUser = res.data; - }).catch((err) => { - console.error(err); - this.connectedUser = null; - throw new ErrorConnectedError('Error to get user element'); - }); + //TODO change url addresse + return Axios.post('http://pusher.workadventure.localhost/user/login',{email, password}).then((res) => { + return res.data; }).catch((err) => { if(err instanceof ErrorConnectedError) { throw err; @@ -146,10 +145,33 @@ class ConnectionManager { * @param name * @param email * @param password - * @param confirmPassword */ - public registerUser(name: string, email: string, password: string, confirmPassword: string){ - Axios.get('http://admin.workadventure.localhost/member/register') + public registerUser(name: string, email: string, password: string){ + //TODO change url addresse + Axios.post('http://pusher.workadventure.localhost/member/register', { + name, + email, + password + }) + .then((res) => { + this.connectedUser = res.data; + }) + .catch((err) => { + this.connectedUser = null; + console.log(err); + throw err; + }) + } + + /** + * + * @param email + */ + public passwordReset(email: string) { + //TODO change url addresse + return Axios.post('http://pusher.workadventure.localhost/user/password/reset', { + email, + }) .then((res) => { this.connectedUser = res.data; }) diff --git a/front/src/Phaser/Menu/MenuScene.ts b/front/src/Phaser/Menu/MenuScene.ts index 559204f4..4ce72f42 100644 --- a/front/src/Phaser/Menu/MenuScene.ts +++ b/front/src/Phaser/Menu/MenuScene.ts @@ -4,6 +4,7 @@ import {gameManager} from "../Game/GameManager"; import {localUserStore} from "../../Connexion/LocalUserStore"; import {mediaManager} from "../../WebRtc/MediaManager"; import {coWebsiteManager} from "../../WebRtc/CoWebsiteManager"; +import {connectionManager} from "../../Connexion/ConnectionManager"; export const MenuSceneName = 'MenuScene'; const gameMenuKey = 'gameMenu'; @@ -144,6 +145,7 @@ export class MenuScene extends Phaser.Scene { openSideMenu() { if (this.sideMenuOpened) return; + this.closeAll(); this.sideMenuOpened = true; this.menuButton.getChildByID('openMenuButton').innerHTML = 'X'; if (gameManager.getCurrentGameScene(this).connection && gameManager.getCurrentGameScene(this).connection.isAdmin()) { @@ -161,12 +163,7 @@ export class MenuScene extends Phaser.Scene { private closeSideMenu(): void { if (!this.sideMenuOpened) return; this.sideMenuOpened = false; - this.closeGameQualityMenu(); - this.closeGameForgotPassword(); - this.closeGameLogin(); - this.closeGameRegister(); - this.closeGameShare(); - this.menuButton.getChildByID('openMenuButton').innerHTML = ``; + this.closeAll(); gameManager.getCurrentGameScene(this).ConsoleGlobalMessageManager.disabledMessageConsole(); this.tweens.add({ targets: this.menuElement, @@ -176,13 +173,13 @@ export class MenuScene extends Phaser.Scene { }); } - - private openGameSettingsMenu(): void { if (this.settingsMenuOpened) { - this.closeGameQualityMenu(); return; } + //close all + this.closeAll(); + this.settingsMenuOpened = true; const gameQualitySelect = this.gameQualityMenuElement.getChildByID('select-game-quality') as HTMLInputElement; @@ -233,12 +230,11 @@ export class MenuScene extends Phaser.Scene { } private openGameLogin(): void{ - this.closeGameRegister(); - this.closeGameForgotPassword(); if (this.gameLoginMenuOpened) { this.closeGameLogin(); return; } + this.closeAll(); this.gameLoginMenuOpened = true; let middleY = (window.innerHeight / 3) - (257); @@ -273,6 +269,8 @@ export class MenuScene extends Phaser.Scene { this.closeGameShare(); return; } + //close all + this.closeAll(); const gameShareLink = this.gameShareElement.getChildByID('gameShareLink') as HTMLInputElement; gameShareLink.value = location.toString(); @@ -313,7 +311,7 @@ export class MenuScene extends Phaser.Scene { let errorForm = false; const gameLoginEmail = this.gameLoginElement.getChildByID('gameLoginEmail') as HTMLInputElement; const gameLoginPassword = this.gameLoginElement.getChildByID('gameLoginPassword') as HTMLInputElement; - const gameLoginError = this.gameLoginElement.getChildByID('gameLoginError') as HTMLInputElement; + const gameLoginError = this.gameLoginElement.getChildByID('gameLoginError') as HTMLParagraphElement; gameLoginError.innerText = ''; gameLoginError.style.display = 'none'; @@ -337,8 +335,16 @@ export class MenuScene extends Phaser.Scene { gameLoginError.innerText = 'Login or password incorrect'; gameLoginError.style.display = 'block'; //TODO login user in back + + connectionManager.userLogin(gameLoginEmail.value, gameLoginPassword.value).then(() => { + this.closeGameLogin(); + }).catch((err) => { + gameLoginError.innerText = err.message; + gameLoginError.style.display = 'block'; + }); } + private sendEmail(){ const gameForgotPasswordInfo = this.gameForgotPasswordElement.getChildByID('gameForgotPasswordInfo') as HTMLParagraphElement; gameForgotPasswordInfo.style.display = 'none'; @@ -357,8 +363,16 @@ export class MenuScene extends Phaser.Scene { return; } //TODO send email - gameForgotPasswordInfo.style.display = 'block'; - gameForgotPasswordInfo.innerText = 'We have emailed your password reset link!'; + connectionManager.passwordReset(gameLoginForgotPasswordEmail.value).then(() => { + gameForgotPasswordInfo.style.display = 'block'; + gameForgotPasswordInfo.innerText = 'We have emailed your password reset link!'; + gameLoginForgotPasswordEmail.value = ''; + this.closeGameLogin(); + }).catch((err) => { + gameForgotPasswordError.innerText = err.message; + gameForgotPasswordError.style.display = 'block'; + gameLoginForgotPasswordEmail.value = ''; + }); } private register(){ @@ -405,6 +419,9 @@ export class MenuScene extends Phaser.Scene { } private openGameForgotPassword(): void{ + //close all + this.closeAll(); + let middleY = (window.innerHeight / 3) - (257); if(middleY < 0){ middleY = 0; @@ -432,6 +449,9 @@ export class MenuScene extends Phaser.Scene { } private openGameRegister(): void{ + //close all + this.closeAll(); + let middleY = (window.innerHeight / 3) - (257); if(middleY < 0){ middleY = 0; @@ -516,4 +536,13 @@ export class MenuScene extends Phaser.Scene { const sparkHost = 'https://'+window.location.host.replace('play.', '')+'/choose-map.html'; window.open(sparkHost, '_blank'); } + + private closeAll(){ + this.closeGameQualityMenu(); + this.closeGameForgotPassword(); + this.closeGameLogin(); + this.closeGameRegister(); + this.closeGameShare(); + this.menuButton.getChildByID('openMenuButton').innerHTML = ``; + } } diff --git a/pusher/src/Controller/AuthenticateController.ts b/pusher/src/Controller/AuthenticateController.ts index bf68768d..ccf09bb1 100644 --- a/pusher/src/Controller/AuthenticateController.ts +++ b/pusher/src/Controller/AuthenticateController.ts @@ -16,6 +16,9 @@ export class AuthenticateController extends BaseController { this.register(); this.verify(); this.anonymLogin(); + this.userRegister(); + this.userLogin(); + this.forgotPassword(); } //Try to login with an admin token @@ -132,4 +135,119 @@ export class AuthenticateController extends BaseController { })); }); } + + private userLogin(){ + this.App.options("/user/login", (res: HttpResponse, req: HttpRequest) => { + this.addCorsHeaders(res); + res.end(); + }); + + this.App.post("/user/login", (res: HttpResponse, req: HttpRequest) => { + + (async () => { + res.onAborted(() => { + console.warn('Login request was aborted'); + }) + + let userUuid = ''; + try { + const params = await res.json(); + + const response = await adminApi.loginUser(params.email as string, params.password as string); + userUuid = response.data.uuid as string; + const authToken = jwtTokenManager.createJWTToken(userUuid); + res.writeStatus("200 OK"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + authToken, + userUuid, + user: response.data + })); + }catch (err){ + res.writeStatus("400 KO"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + message: 'Email or password incorrect' + })); + } + })(); + }); + } + + private userRegister(){ + this.App.options("/user/register", (res: HttpResponse, req: HttpRequest) => { + this.addCorsHeaders(res); + res.end(); + }); + + this.App.post("/user/register", (res: HttpResponse, req: HttpRequest) => { + + (async () => { + + res.onAborted(() => { + console.warn('Register request was aborted'); + }) + + let userUuid = ''; + try { + const params = await res.json(); + + const response = await adminApi.register( + params.name as string, + params.email as string, + params.password as string + ); + userUuid = response.data.uuid as string; + const authToken = jwtTokenManager.createJWTToken(userUuid); + res.writeStatus("200 OK"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + authToken, + userUuid, + user: response.data + })); + }catch (err){ + res.writeStatus("400 KO"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + message: err.message + })); + } + })(); + }); + } + + private forgotPassword() { + this.App.options("/user/password/reset", (res: HttpResponse, req: HttpRequest) => { + this.addCorsHeaders(res); + res.end(); + }); + + this.App.post("/user/password/reset", (res: HttpResponse, req: HttpRequest) => { + + (async () => { + + res.onAborted(() => { + console.warn('Forgot password request was aborted'); + }); + + try { + const params = await res.json(); + await adminApi.forgotPassword(params.email as string); + res.writeStatus("200 OK"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + message: 'Email sent!' + })); + } catch (err) { + res.writeStatus("400 KO"); + this.addCorsHeaders(res); + res.end(JSON.stringify({ + message: err.message + })); + } + + })(); + }); + } } diff --git a/pusher/src/Enum/EnvironmentVariable.ts b/pusher/src/Enum/EnvironmentVariable.ts index 62ebccc1..fb8b9e2a 100644 --- a/pusher/src/Enum/EnvironmentVariable.ts +++ b/pusher/src/Enum/EnvironmentVariable.ts @@ -4,7 +4,7 @@ const MINIMUM_DISTANCE = process.env.MINIMUM_DISTANCE ? Number(process.env.MINIM const GROUP_RADIUS = process.env.GROUP_RADIUS ? Number(process.env.GROUP_RADIUS) : 48; const ALLOW_ARTILLERY = process.env.ALLOW_ARTILLERY ? process.env.ALLOW_ARTILLERY == 'true' : false; const API_URL = process.env.API_URL || ''; -const ADMIN_API_URL = process.env.ADMIN_API_URL || ''; +const ADMIN_API_URL = process.env.ADMIN_API_URL || 'http://admin'; const ADMIN_API_TOKEN = process.env.ADMIN_API_TOKEN || 'myapitoken'; const MAX_USERS_PER_ROOM = parseInt(process.env.MAX_USERS_PER_ROOM || '') || 600; const CPU_OVERHEAT_THRESHOLD = Number(process.env.CPU_OVERHEAT_THRESHOLD) || 80; diff --git a/pusher/src/Services/AdminApi.ts b/pusher/src/Services/AdminApi.ts index 9c46a41b..27dbab59 100644 --- a/pusher/src/Services/AdminApi.ts +++ b/pusher/src/Services/AdminApi.ts @@ -110,6 +110,61 @@ class AdminApi { headers: {"Authorization": `${ADMIN_API_TOKEN}`} }); } + + /** + * + * @param email + * @param password + */ + loginUser(email: string, password: string) { + console.log('email', email); + console.log('password', password); + return Axios.post(`${ADMIN_API_URL}/api/user/login`, { + email, + password, + }, + { + headers: {"Authorization": `${ADMIN_API_TOKEN}`} + }); + } + + /** + * + * @param name + * @param email + * @param password + */ + register( + name: string, + email: string, + password: string, + ) { + return Axios.post(`${ADMIN_API_URL}/api/user/register`, { + name, + email, + password, + }, + { + headers: {"Authorization": `${ADMIN_API_TOKEN}`} + }); + } + + /** + * + * @param name + * @param email + * @param password + */ + forgotPassword( + email: string + ) { + return Axios.post(`${ADMIN_API_URL}/api/user/password/reset`, { + email + }, + { + headers: {"Authorization": `${ADMIN_API_TOKEN}`} + }); + } } export const adminApi = new AdminApi();