From 73a2b08506489515c9b30e2999aab046d83749bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Thu, 5 Sep 2024 20:12:38 +0200 Subject: [PATCH 01/45] refactor: #44 endpoints alias --- .../login/components/forgot-password.component.spec.ts | 2 +- .../login/components/forgot-password.component.ts | 2 +- .../user-workflow/login/components/login-form.component.ts | 2 +- .../login/components/reset-password.component.spec.ts | 2 +- .../login/components/reset-password.component.ts | 2 +- .../register/components/register-confirm.component.ts | 2 +- .../register/components/register-form.component.ts | 2 +- tsconfig.json | 6 +++++- 8 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/app/user-workflow/login/components/forgot-password.component.spec.ts b/src/app/user-workflow/login/components/forgot-password.component.spec.ts index 49933e27..99b800f9 100644 --- a/src/app/user-workflow/login/components/forgot-password.component.spec.ts +++ b/src/app/user-workflow/login/components/forgot-password.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ForgotPasswordComponent } from './forgot-password.component'; import { ReactiveFormsModule } from '@angular/forms'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { NotificationService } from 'app/shared/services/notification.service'; import { of, throwError } from 'rxjs'; diff --git a/src/app/user-workflow/login/components/forgot-password.component.ts b/src/app/user-workflow/login/components/forgot-password.component.ts index d79e1e86..487fbe72 100644 --- a/src/app/user-workflow/login/components/forgot-password.component.ts +++ b/src/app/user-workflow/login/components/forgot-password.component.ts @@ -4,7 +4,7 @@ import { ReactiveFormsModule, Validators, } from '@angular/forms'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { NotificationService } from 'app/shared/services/notification.service'; import { Subscription } from 'rxjs'; diff --git a/src/app/user-workflow/login/components/login-form.component.ts b/src/app/user-workflow/login/components/login-form.component.ts index 2faac68e..98fc7969 100644 --- a/src/app/user-workflow/login/components/login-form.component.ts +++ b/src/app/user-workflow/login/components/login-form.component.ts @@ -5,7 +5,7 @@ import { Validators, } from '@angular/forms'; import { FormValidationService } from '../../../shared/services/form-validation.service'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { IUserLoginRequest } from 'app/shared/models/user.models'; import { Router } from '@angular/router'; import { Subscription } from 'rxjs'; diff --git a/src/app/user-workflow/login/components/reset-password.component.spec.ts b/src/app/user-workflow/login/components/reset-password.component.spec.ts index 6848add1..6fd5193a 100644 --- a/src/app/user-workflow/login/components/reset-password.component.spec.ts +++ b/src/app/user-workflow/login/components/reset-password.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ResetPasswordComponent } from './reset-password.component'; import { ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { of, throwError } from 'rxjs'; import { RouterTestingModule } from '@angular/router/testing'; diff --git a/src/app/user-workflow/login/components/reset-password.component.ts b/src/app/user-workflow/login/components/reset-password.component.ts index edc4c5cb..2f6ccc71 100644 --- a/src/app/user-workflow/login/components/reset-password.component.ts +++ b/src/app/user-workflow/login/components/reset-password.component.ts @@ -6,7 +6,7 @@ import { Validators, } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { Subscription } from 'rxjs'; @Component({ diff --git a/src/app/user-workflow/register/components/register-confirm.component.ts b/src/app/user-workflow/register/components/register-confirm.component.ts index bbe78561..07fd58b3 100644 --- a/src/app/user-workflow/register/components/register-confirm.component.ts +++ b/src/app/user-workflow/register/components/register-confirm.component.ts @@ -1,7 +1,7 @@ import { NgOptimizedImage } from '@angular/common'; import { Component, inject, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { Subscription } from 'rxjs'; @Component({ diff --git a/src/app/user-workflow/register/components/register-form.component.ts b/src/app/user-workflow/register/components/register-form.component.ts index 522f212a..3fca05f4 100644 --- a/src/app/user-workflow/register/components/register-form.component.ts +++ b/src/app/user-workflow/register/components/register-form.component.ts @@ -7,7 +7,7 @@ import { } from '@angular/forms'; import { FormValidationService } from '../../../shared/services/form-validation.service'; import { IUserRequest } from 'app/shared/models/user.models'; -import { UserEndpointsService } from 'app/shared/services/endpoints/user-endpoints.service'; +import { UserEndpointsService } from '@endpoints/user-endpoints.service'; import { Router } from '@angular/router'; import { Subscription } from 'rxjs'; import { NotificationService } from 'app/shared/services/notification.service'; diff --git a/tsconfig.json b/tsconfig.json index d0fa1d93..4d6ccacf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,11 @@ "useDefineForClassFields": false, "lib": ["ES2022", "dom"], "baseUrl": "src", - "paths": { "@env/*": ["environments/*"], "@utils/*": ["utils/*"] } + "paths": { + "@env/*": ["environments/*"], + "@utils/*": ["utils/*"], + "@endpoints/*": ["app/shared/services/endpoints/*"] + } }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, From 461ca10dbf545f4a35d067c199c4249812651d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Thu, 5 Sep 2024 20:26:50 +0200 Subject: [PATCH 02/45] refactor: #44 gameModels alias --- .../ai-socket-menu/ai-socket-menu.component.spec.ts | 6 +++--- .../components/ai-socket-menu/ai-socket-menu.component.ts | 6 +++--- .../debug-mode-panel/debug-mode-panel.component.ts | 4 ++-- .../components/player-socket-connection-menu.component.ts | 6 +++--- .../components/player-socket-menu.component.spec.ts | 4 ++-- .../components/player-socket-menu.component.ts | 4 ++-- .../ai-socket-menu/services/ai-socket.service.ts | 2 +- .../console-fieldset/console-fieldset.component.spec.ts | 2 +- .../console-fieldset/console-fieldset.component.ts | 2 +- src/app/game/components/console/console.component.ts | 2 +- .../data-download/data-download.component.spec.ts | 2 +- .../components/data-download/data-download.component.ts | 2 +- .../data-select-checkbox.component.ts | 2 +- src/app/game/components/data-menu/data-menu.component.ts | 2 +- .../data-menu/services/game-data-sending.service.ts | 2 +- .../components/player-menu/player-menu.component.spec.ts | 4 ++-- .../game/components/player-menu/player-menu.component.ts | 4 ++-- src/app/game/data/games.ts | 2 +- src/app/game/game.page.component.ts | 8 ++++---- src/app/game/games/base-game.component.ts | 8 ++++---- src/app/game/games/models/pong.class.ts | 8 ++++---- src/app/game/games/pong/pong.component.ts | 2 +- src/app/game/models/game.class.ts | 4 ++-- src/app/game/models/player-input-data.type.ts | 4 ++-- src/app/game/models/player.class.ts | 4 ++-- src/app/shared/services/data-transform.service.ts | 2 +- src/utils/pipes/exchange-data.pipe.ts | 2 +- tsconfig.json | 3 ++- 28 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts index e0edece6..bc4ac792 100644 --- a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts +++ b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts @@ -1,10 +1,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { AiSocketMenuComponent } from './ai-socket-menu.component'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Player } from 'app/game/models/player.class'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { Player } from '@gameModels/player.class'; @Component({ selector: 'app-player-socket-menu', diff --git a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts index 1fc27ec0..82188a8d 100644 --- a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts @@ -1,11 +1,11 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { TExchangeData } from '../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { SocketDomainInputComponent } from './components/components/components/socket-domain-input/socket-domain-input.component'; import { SocketConnectedMenuComponent } from './components/components/components/socket-connected-menu/socket-connected-menu.component'; import { DebugModeMenuComponent } from './components/components/components/debug-mode-menu/debug-mode-menu.component'; import { DebugModePanelComponent } from './components/components/components/debug-mode-panel/debug-mode-panel.component'; -import { Player } from 'app/game/models/player.class'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; +import { Player } from '@gameModels/player.class'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { PlayerSocketMenuComponent } from './components/player-socket-menu.component'; import { Observable, Subscription } from 'rxjs'; diff --git a/src/app/game/components/ai-socket-menu/components/components/components/debug-mode-panel/debug-mode-panel.component.ts b/src/app/game/components/ai-socket-menu/components/components/components/debug-mode-panel/debug-mode-panel.component.ts index 7810cd0c..e7c3ca55 100644 --- a/src/app/game/components/ai-socket-menu/components/components/components/debug-mode-panel/debug-mode-panel.component.ts +++ b/src/app/game/components/ai-socket-menu/components/components/components/debug-mode-panel/debug-mode-panel.component.ts @@ -1,7 +1,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { TExchangeData } from '../../../../../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { KeyValuePipe } from '@angular/common'; -import { Player } from 'app/game/models/player.class'; +import { Player } from '@gameModels/player.class'; @Component({ selector: 'app-debug-mode-panel', diff --git a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts index 81101290..4994362e 100644 --- a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts @@ -8,9 +8,9 @@ import { Output, } from '@angular/core'; import { AiSocketService } from '../../services/ai-socket.service'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; -import { Player } from 'app/game/models/player.class'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { Player } from '@gameModels/player.class'; import { SocketDomainInputComponent } from './components/socket-domain-input/socket-domain-input.component'; import { SocketConnectedMenuComponent } from './components/socket-connected-menu/socket-connected-menu.component'; import { Observable, Subscription } from 'rxjs'; diff --git a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts index 27bc93e8..94664ec2 100644 --- a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts +++ b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts @@ -1,13 +1,13 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PlayerSocketMenuComponent } from './player-socket-menu.component'; -import { Player } from 'app/game/models/player.class'; +import { Player } from '@gameModels/player.class'; import { DebugModeMenuComponent } from './components/components/debug-mode-menu/debug-mode-menu.component'; import { DebugModePanelComponent } from './components/components/debug-mode-panel/debug-mode-panel.component'; import { SocketDomainInputComponent } from './components/components/socket-domain-input/socket-domain-input.component'; import { SocketConnectedMenuComponent } from './components/components/socket-connected-menu/socket-connected-menu.component'; import { AiSocketService } from '../services/ai-socket.service'; import { By } from '@angular/platform-browser'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; describe('PlayerSocketMenuComponent', () => { let component: PlayerSocketMenuComponent; diff --git a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.ts b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.ts index 06218b19..12431407 100644 --- a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; -import { Player } from 'app/game/models/player.class'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { Player } from '@gameModels/player.class'; import { DebugModeMenuComponent } from './components/components/debug-mode-menu/debug-mode-menu.component'; import { DebugModePanelComponent } from './components/components/debug-mode-panel/debug-mode-panel.component'; import { SocketDomainInputComponent } from './components/components/socket-domain-input/socket-domain-input.component'; diff --git a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts index 60b3ffeb..79c7e25a 100644 --- a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts +++ b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { TExchangeData } from '../../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Injectable({ providedIn: 'root', diff --git a/src/app/game/components/console/console-fieldset/console-fieldset.component.spec.ts b/src/app/game/components/console/console-fieldset/console-fieldset.component.spec.ts index 68c590cd..8bff2f45 100644 --- a/src/app/game/components/console/console-fieldset/console-fieldset.component.spec.ts +++ b/src/app/game/components/console/console-fieldset/console-fieldset.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { KeyValuePipe } from '@angular/common'; import { ExchangeDataPipe } from '@utils/pipes/exchange-data.pipe'; import { ConsoleFieldsetComponent } from './console-fieldset.component'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; describe('ConsoleFieldsetComponent', () => { let component: ConsoleFieldsetComponent; diff --git a/src/app/game/components/console/console-fieldset/console-fieldset.component.ts b/src/app/game/components/console/console-fieldset/console-fieldset.component.ts index 15dad335..35d34395 100644 --- a/src/app/game/components/console/console-fieldset/console-fieldset.component.ts +++ b/src/app/game/components/console/console-fieldset/console-fieldset.component.ts @@ -1,7 +1,7 @@ import { KeyValuePipe } from '@angular/common'; import { Component, Input } from '@angular/core'; import { ExchangeDataPipe } from '@utils/pipes/exchange-data.pipe'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Component({ selector: 'app-console-fieldset', diff --git a/src/app/game/components/console/console.component.ts b/src/app/game/components/console/console.component.ts index 32e94bd7..837fbf33 100644 --- a/src/app/game/components/console/console.component.ts +++ b/src/app/game/components/console/console.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { TExchangeData } from '../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { ExchangeDataPipe } from '@utils/pipes/exchange-data.pipe'; import { ConsoleFieldsetComponent } from './console-fieldset/console-fieldset.component'; diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts index ae2e9536..400f504b 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DataDownloadComponent } from './data-download.component'; import { GameDataSendingService } from '../../services/game-data-sending.service'; import { DataTransformService } from 'app/shared/services/data-transform.service'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; import { HttpClient, HttpHandler } from '@angular/common/http'; diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.ts index a8815875..0de7ae7d 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { GameDataSendingService } from '../../services/game-data-sending.service'; -import { TExchangeData } from 'app/game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Component({ selector: 'app-data-download', diff --git a/src/app/game/components/data-menu/components/data-select-checkbox/data-select-checkbox.component.ts b/src/app/game/components/data-menu/components/data-select-checkbox/data-select-checkbox.component.ts index 57489084..5ed2ea3b 100644 --- a/src/app/game/components/data-menu/components/data-select-checkbox/data-select-checkbox.component.ts +++ b/src/app/game/components/data-menu/components/data-select-checkbox/data-select-checkbox.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; import { KeyValue } from '@angular/common'; -import { TExchangeData } from '../../../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Component({ selector: 'app-data-select-checkbox', diff --git a/src/app/game/components/data-menu/data-menu.component.ts b/src/app/game/components/data-menu/data-menu.component.ts index d4ba7fa7..be7a9813 100644 --- a/src/app/game/components/data-menu/data-menu.component.ts +++ b/src/app/game/components/data-menu/data-menu.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { TExchangeData } from '../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { KeyValuePipe } from '@angular/common'; import { ActivatedRoute, Router } from '@angular/router'; import { DataSelectCheckboxComponent } from './components/data-select-checkbox/data-select-checkbox.component'; diff --git a/src/app/game/components/data-menu/services/game-data-sending.service.ts b/src/app/game/components/data-menu/services/game-data-sending.service.ts index d48b04dd..6ab67005 100644 --- a/src/app/game/components/data-menu/services/game-data-sending.service.ts +++ b/src/app/game/components/data-menu/services/game-data-sending.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable } from '@angular/core'; -import { TExchangeData } from '../../../models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { environment } from '@env/environment'; diff --git a/src/app/game/components/player-menu/player-menu.component.spec.ts b/src/app/game/components/player-menu/player-menu.component.spec.ts index 3c6dc9f4..82922b2a 100644 --- a/src/app/game/components/player-menu/player-menu.component.spec.ts +++ b/src/app/game/components/player-menu/player-menu.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PlayerMenuComponent } from './player-menu.component'; import { By } from '@angular/platform-browser'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; -import { Player } from 'app/game/models/player.class'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { Player } from '@gameModels/player.class'; import { AiSocketService } from '../ai-socket-menu/services/ai-socket.service'; describe('PlayerMenuComponent', () => { diff --git a/src/app/game/components/player-menu/player-menu.component.ts b/src/app/game/components/player-menu/player-menu.component.ts index 9deef3b2..3a95f22d 100644 --- a/src/app/game/components/player-menu/player-menu.component.ts +++ b/src/app/game/components/player-menu/player-menu.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; -import { Player } from 'app/game/models/player.class'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { Player } from '@gameModels/player.class'; @Component({ selector: 'app-player-menu', diff --git a/src/app/game/data/games.ts b/src/app/game/data/games.ts index 6b219396..8e342787 100644 --- a/src/app/game/data/games.ts +++ b/src/app/game/data/games.ts @@ -1,5 +1,5 @@ +import { Game } from '@gameModels/game.class'; import { Pong } from '../games/models/pong.class'; -import { Game } from '../models/game.class'; export const games: Record = { pong: new Pong(), diff --git a/src/app/game/game.page.component.ts b/src/app/game/game.page.component.ts index 4d884b94..d898f3ef 100644 --- a/src/app/game/game.page.component.ts +++ b/src/app/game/game.page.component.ts @@ -1,15 +1,15 @@ import { Component, OnDestroy, OnInit, inject } from '@angular/core'; -import { Game } from './models/game.class'; +import { Game } from '@gameModels/game.class'; import { ConsoleComponent } from './components/console/console.component'; -import { TExchangeData } from './models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; import { DataMenuComponent } from './components/data-menu/data-menu.component'; import { AiSocketMenuComponent } from './components/ai-socket-menu/ai-socket-menu.component'; import { PongGameWindowComponent } from './games/pong/pong.component'; import { AuthRequiredDirective } from '@utils/directives/auth-required.directive'; import { Subject, Subscription } from 'rxjs'; -import { Player } from './models/player.class'; +import { Player } from '@gameModels/player.class'; import { PlayerMenuComponent } from './components/player-menu/player-menu.component'; -import { PlayerSourceType } from './models/player-source-type.enum'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { games } from './data/games'; import { ActivatedRoute, Router, NavigationStart } from '@angular/router'; import { GameMenuComponent } from './components/game-menu/game-menu.component'; diff --git a/src/app/game/games/base-game.component.ts b/src/app/game/games/base-game.component.ts index 7e598866..ee7d2608 100644 --- a/src/app/game/games/base-game.component.ts +++ b/src/app/game/games/base-game.component.ts @@ -9,12 +9,12 @@ import { ViewChild, DoCheck, } from '@angular/core'; -import { TExchangeData } from '../models/exchange-data.type'; -import { Player } from 'app/game/models/player.class'; -import { IPlayerInputData } from 'app/game/models/player-input-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { Player } from '@gameModels/player.class'; import { Observable, Subscription } from 'rxjs'; import { CanvasComponent } from '../components/canvas/canvas.component'; -import { Game } from '../models/game.class'; +import { Game } from '@gameModels/game.class'; +import { IPlayerInputData } from '@gameModels/player-input-data.type'; @Component({ selector: 'app-base-game-window', diff --git a/src/app/game/games/models/pong.class.ts b/src/app/game/games/models/pong.class.ts index 916a71e0..d8f40479 100644 --- a/src/app/game/games/models/pong.class.ts +++ b/src/app/game/games/models/pong.class.ts @@ -1,6 +1,6 @@ -import { TGameState } from 'app/game/models/game-state.type'; -import { Game } from 'app/game/models/game.class'; -import { Player } from 'app/game/models/player.class'; +import { TGameState } from '@gameModels/game-state.type'; +import { Game } from '@gameModels/game.class'; +import { Player } from '@gameModels/player.class'; class PongState implements TGameState { public leftPaddleY = 0; @@ -32,7 +32,7 @@ export class Pong extends Game { ballSpeedMultiplier: number, <1, inf>; scoreLeft: number, <0, inf>; scoreRight: number, <0, inf>; - + default values: ballX: 500; ballY: 300; diff --git a/src/app/game/games/pong/pong.component.ts b/src/app/game/games/pong/pong.component.ts index bfd01b0e..23532d4a 100644 --- a/src/app/game/games/pong/pong.component.ts +++ b/src/app/game/games/pong/pong.component.ts @@ -2,7 +2,7 @@ /* eslint-disable max-lines */ import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; import { CanvasComponent } from '../../components/canvas/canvas.component'; -import { PlayerSourceType } from 'app/game/models/player-source-type.enum'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { BaseGameWindowComponent } from '../base-game.component'; import { Pong } from '../models/pong.class'; diff --git a/src/app/game/models/game.class.ts b/src/app/game/models/game.class.ts index 676ef424..e568d770 100644 --- a/src/app/game/models/game.class.ts +++ b/src/app/game/models/game.class.ts @@ -1,5 +1,5 @@ -import { Player } from './player.class'; -import { TGameState } from './game-state.type'; +import { Player } from '@gameModels/player.class'; +import { TGameState } from '@gameModels/game-state.type'; export abstract class Game { public abstract name: string; diff --git a/src/app/game/models/player-input-data.type.ts b/src/app/game/models/player-input-data.type.ts index e4867a22..6146b6aa 100644 --- a/src/app/game/models/player-input-data.type.ts +++ b/src/app/game/models/player-input-data.type.ts @@ -1,5 +1,5 @@ -import { TExchangeData } from './exchange-data.type'; -import { Player } from './player.class'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { Player } from '@gameModels/player.class'; export interface IPlayerInputData { player: Player; diff --git a/src/app/game/models/player.class.ts b/src/app/game/models/player.class.ts index f14642f7..30c17a0b 100644 --- a/src/app/game/models/player.class.ts +++ b/src/app/game/models/player.class.ts @@ -1,5 +1,5 @@ -import { TExchangeData } from './exchange-data.type'; -import { PlayerSourceType } from './player-source-type.enum'; +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { PlayerSourceType } from '@gameModels/player-source-type.enum'; export class Player { public id: number; diff --git a/src/app/shared/services/data-transform.service.ts b/src/app/shared/services/data-transform.service.ts index 544ef6ba..00957469 100644 --- a/src/app/shared/services/data-transform.service.ts +++ b/src/app/shared/services/data-transform.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { TExchangeData } from '../../game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Injectable({ providedIn: 'root', diff --git a/src/utils/pipes/exchange-data.pipe.ts b/src/utils/pipes/exchange-data.pipe.ts index 91ac6941..18ba7b31 100644 --- a/src/utils/pipes/exchange-data.pipe.ts +++ b/src/utils/pipes/exchange-data.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core'; -import { TExchangeData } from '../../app/game/models/exchange-data.type'; +import { TExchangeData } from '@gameModels/exchange-data.type'; @Pipe({ name: 'exchange_data', diff --git a/tsconfig.json b/tsconfig.json index 4d6ccacf..86a89fb8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,7 +25,8 @@ "paths": { "@env/*": ["environments/*"], "@utils/*": ["utils/*"], - "@endpoints/*": ["app/shared/services/endpoints/*"] + "@endpoints/*": ["app/shared/services/endpoints/*"], + "@gameModels/*": ["app/game/models/*"] } }, "angularCompilerOptions": { From 7fece4b05d55d63a71a35007dd939fcae7dfd25f Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Sat, 7 Sep 2024 13:01:31 +0200 Subject: [PATCH 03/45] Update pong.component.ts --- src/app/game/games/pong/pong.component.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/game/games/pong/pong.component.ts b/src/app/game/games/pong/pong.component.ts index 23532d4a..b9950e4d 100644 --- a/src/app/game/games/pong/pong.component.ts +++ b/src/app/game/games/pong/pong.component.ts @@ -125,15 +125,13 @@ export class PongGameWindowComponent private checkPointScored(): void { if ( - this.game.state.ballX <= 0 - this._ballWidth || - Math.abs(this.game.state.ballSpeedX) < 1 + this.game.state.ballX <= 0 - this._ballWidth ) { this.resetPaddlesAndBall(); this.game.state.scoreRight++; } if ( - this.game.state.ballX >= this._canvas.width + this._ballWidth || - Math.abs(this.game.state.ballSpeedX) < 1 + this.game.state.ballX >= this._canvas.width + this._ballWidth ) { this.resetPaddlesAndBall(); this.game.state.scoreLeft++; From 6a0cb52df1ef860a11cbddee102da198769f147f Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Mon, 9 Sep 2024 10:31:05 +0200 Subject: [PATCH 04/45] dockerfile --- Dockerfile | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..1aaffa11 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM --platform=$BUILDPLATFORM node:20.11.1-bullseye-slim as builder + +RUN mkdir /project +WORKDIR /project + +RUN npm install -g @angular/cli@18 + +COPY "rag-2-frontend/package.json" "rag-2-frontend/package-lock.json" ./ +RUN npm ci + +COPY . . +CMD ["ng", "serve", "--host", "0.0.0.0"] + +FROM builder as dev-envs + +RUN < Date: Mon, 9 Sep 2024 14:17:41 +0200 Subject: [PATCH 05/45] fix: #dev pong logic and console view fix --- .../console-fieldset.component.ts | 2 +- .../components/console/console.component.ts | 4 +-- src/app/game/games/pong/pong.component.ts | 32 +++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/app/game/components/console/console-fieldset/console-fieldset.component.ts b/src/app/game/components/console/console-fieldset/console-fieldset.component.ts index 35d34395..7db0469b 100644 --- a/src/app/game/components/console/console-fieldset/console-fieldset.component.ts +++ b/src/app/game/components/console/console-fieldset/console-fieldset.component.ts @@ -9,7 +9,7 @@ import { TExchangeData } from '@gameModels/exchange-data.type'; imports: [KeyValuePipe, ExchangeDataPipe], template: ` @for (data of logData | keyvalue; track data.key) { -
+
{{ data.key }}: diff --git a/src/app/game/components/console/console.component.ts b/src/app/game/components/console/console.component.ts index 837fbf33..25d55780 100644 --- a/src/app/game/components/console/console.component.ts +++ b/src/app/game/components/console/console.component.ts @@ -34,8 +34,8 @@ export class ConsoleComponent { public consoleClasses: TExchangeData = { button: `w-full bg-lightGray tracking-[0.15em] sticky z-50 top-0 transition-all ease-in-out duration-700 border-b-2 border-mainOrange hover:border-green-500 text-center py-2 uppercase font-bold font-mono text-xl cursor-pointer`, - consoleContainer: `w-full max-h-96 transition-all ease-in-out duration-700 bg-lightGray overflow-y-scroll z-50 `, - consoleFieldset: `grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 items-start gap-y-6 transition-all ease-in-out duration-700`, + consoleContainer: `w-full max-h-96 transition-all ease-in-out duration-700 bg-lightGray overflow-y-scroll z-50 px-5`, + consoleFieldset: `items-start gap-y-6 transition-all ease-in-out duration-700`, }; public toggleConsole(): void { diff --git a/src/app/game/games/pong/pong.component.ts b/src/app/game/games/pong/pong.component.ts index b9950e4d..27733b02 100644 --- a/src/app/game/games/pong/pong.component.ts +++ b/src/app/game/games/pong/pong.component.ts @@ -22,6 +22,8 @@ export class PongGameWindowComponent private _paddleJump = 20; private _ballWidth = 10; private _canvas!: HTMLCanvasElement; + private _leftPaddleX = 10; + private _rightPaddleX!: number; public override game!: Pong; @@ -69,13 +71,13 @@ export class PongGameWindowComponent context.clearRect(0, 0, this._canvas.width, this._canvas.height); context.fillStyle = 'red'; context.fillRect( - 0, + this._leftPaddleX, this.game.state.leftPaddleY, this._paddleWidth, this._paddleHeight ); context.fillRect( - this._canvas.width - this._paddleWidth, + this._rightPaddleX, this.game.state.rightPaddleY, this._paddleWidth, this._paddleHeight @@ -103,6 +105,8 @@ export class PongGameWindowComponent this.game.state.ballSpeedX = 0; this.game.state.ballSpeedY = 0; this.game.state.ballSpeedMultiplier = 1; + + this._rightPaddleX = this._canvas.width - this._paddleWidth - 10; } private updateBallPosition(): void { @@ -124,15 +128,11 @@ export class PongGameWindowComponent } private checkPointScored(): void { - if ( - this.game.state.ballX <= 0 - this._ballWidth - ) { + if (this.game.state.ballX <= 0 - this._ballWidth) { this.resetPaddlesAndBall(); this.game.state.scoreRight++; } - if ( - this.game.state.ballX >= this._canvas.width + this._ballWidth - ) { + if (this.game.state.ballX >= this._canvas.width + this._ballWidth) { this.resetPaddlesAndBall(); this.game.state.scoreLeft++; } @@ -148,26 +148,30 @@ export class PongGameWindowComponent } private checkCollisionWithPaddles(): void { + // left paddle if ( - this.game.state.ballX <= this._ballWidth * 2 && + this.game.state.ballX <= this._leftPaddleX + this._ballWidth && this.game.state.ballY >= this.game.state.leftPaddleY && this.game.state.ballY <= this.game.state.leftPaddleY + this._paddleHeight ) { const rotation = this.game.state.leftPaddleSpeed / 6; - this.game.state.ballSpeedY = this.game.state.ballSpeedY + rotation; - this.game.state.ballSpeedX = -this.game.state.ballSpeedX; + this.game.state.ballSpeedY += rotation; + this.game.state.ballSpeedX = Math.abs(this.game.state.ballSpeedX); this.game.state.ballSpeedMultiplier += 0.05; + this.game.state.ballX = this._leftPaddleX + this._ballWidth; } + // right paddle if ( - this.game.state.ballX >= this._canvas.width - 2 * this._ballWidth && + this.game.state.ballX >= this._rightPaddleX - this._ballWidth && this.game.state.ballY >= this.game.state.rightPaddleY && this.game.state.ballY <= this.game.state.rightPaddleY + this._paddleHeight ) { const rotation = this.game.state.rightPaddleSpeed / 4; - this.game.state.ballSpeedY = this.game.state.ballSpeedY + rotation; - this.game.state.ballSpeedX = -this.game.state.ballSpeedX; + this.game.state.ballSpeedY += rotation; + this.game.state.ballSpeedX = -Math.abs(this.game.state.ballSpeedX); this.game.state.ballSpeedMultiplier += 0.05; + this.game.state.ballX = this._rightPaddleX - this._ballWidth; } } From 5c5c03057dc5abe1daa04e082c7e966c4f9617f0 Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Mon, 9 Sep 2024 14:23:56 +0200 Subject: [PATCH 06/45] fix: #dev fullscreen button hidden --- src/app/game/components/canvas/canvas.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/game/components/canvas/canvas.component.ts b/src/app/game/components/canvas/canvas.component.ts index 3dba078a..a3cc3065 100644 --- a/src/app/game/components/canvas/canvas.component.ts +++ b/src/app/game/components/canvas/canvas.component.ts @@ -19,13 +19,13 @@ import * as feather from 'feather-icons'; [attr.width]="width" [attr.height]="height" class="border-mainOrange border-2"> - + -->
`, }) From 0dbc8048f6e60fd9bc0c1473852b65e18eff4bd0 Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Tue, 10 Sep 2024 09:25:31 +0200 Subject: [PATCH 07/45] feat: #dev sending player id to socket --- .../player-socket-connection-menu.component.ts | 6 ++++-- .../ai-socket-menu/services/ai-socket.service.ts | 14 +++++++++----- src/app/game/data/games.ts | 2 +- src/app/game/games/{ => pong}/models/pong.class.ts | 4 ++-- src/app/game/games/pong/pong.component.ts | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) rename src/app/game/games/{ => pong}/models/pong.class.ts (99%) diff --git a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts index 4994362e..5c288253 100644 --- a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts @@ -83,7 +83,8 @@ export class PlayerSocketConnectionMenuComponent implements OnInit, OnDestroy { this.isPaused = false; this.aiSocketService.resumeDataExchange( this.vSendingInterval.value, - this.player.inputData + this.player.inputData, + this.player.id ); } }); @@ -112,7 +113,8 @@ export class PlayerSocketConnectionMenuComponent implements OnInit, OnDestroy { public onStartDataExchangeClick = (): void => { this.aiSocketService.startDataExchange( this.vSendingInterval.value, - this.player.inputData + this.player.inputData, + this.player.id ); }; diff --git a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts index 79c7e25a..dfded96e 100644 --- a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts +++ b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts @@ -41,10 +41,11 @@ export class AiSocketService { public startDataExchange = ( sendingInterval: number, - expectedDataToReceive: TExchangeData + expectedDataToReceive: TExchangeData, + playerId: number ): void => { this.isDataExchangeDesired = true; - this.resumeDataExchange(sendingInterval, expectedDataToReceive); + this.resumeDataExchange(sendingInterval, expectedDataToReceive, playerId); }; public stopDataExchange = (): void => { @@ -62,12 +63,13 @@ export class AiSocketService { public resumeDataExchange = ( sendingInterval: number, - expectedDataToReceive: TExchangeData + expectedDataToReceive: TExchangeData, + playerId: number ): void => { if (!this.isDataExchangeDesired) return; this.isDataSendingActive = true; this._sendingIntervalID = setInterval(() => { - this.sendDataToSocket(this._dataToSend, expectedDataToReceive); + this.sendDataToSocket(this._dataToSend, expectedDataToReceive, playerId); }, sendingInterval); }; @@ -91,12 +93,14 @@ export class AiSocketService { private sendDataToSocket( dataToSend: TExchangeData, - expectedDataToReceive: TExchangeData + expectedDataToReceive: TExchangeData, + playerId: number ): void { if (this._socket && this.isSocketConnected) { this._socket.send( JSON.stringify({ name: dataToSend['name'], + playerId: playerId, state: dataToSend['state'], players: dataToSend['players'], expected_input: expectedDataToReceive, diff --git a/src/app/game/data/games.ts b/src/app/game/data/games.ts index 8e342787..21d45e3a 100644 --- a/src/app/game/data/games.ts +++ b/src/app/game/data/games.ts @@ -1,5 +1,5 @@ import { Game } from '@gameModels/game.class'; -import { Pong } from '../games/models/pong.class'; +import { Pong } from '../games/pong/models/pong.class'; export const games: Record = { pong: new Pong(), diff --git a/src/app/game/games/models/pong.class.ts b/src/app/game/games/pong/models/pong.class.ts similarity index 99% rename from src/app/game/games/models/pong.class.ts rename to src/app/game/games/pong/models/pong.class.ts index d8f40479..e6d35b36 100644 --- a/src/app/game/games/models/pong.class.ts +++ b/src/app/game/games/pong/models/pong.class.ts @@ -41,14 +41,14 @@ export class Pong extends Game { `; public override players = [ new Player( - 1, + 0, true, 'Player 1', { move: 0 }, 'Value of {-1, 0, 1}, -1: down, 0: stop, 1: up' ), new Player( - 2, + 1, true, 'Player 2', { move: 0 }, diff --git a/src/app/game/games/pong/pong.component.ts b/src/app/game/games/pong/pong.component.ts index 27733b02..08fcc335 100644 --- a/src/app/game/games/pong/pong.component.ts +++ b/src/app/game/games/pong/pong.component.ts @@ -4,7 +4,7 @@ import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; import { CanvasComponent } from '../../components/canvas/canvas.component'; import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { BaseGameWindowComponent } from '../base-game.component'; -import { Pong } from '../models/pong.class'; +import { Pong } from './models/pong.class'; @Component({ selector: 'app-pong', From f979e38afa67e50fada6f8c4c672648428735bce Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Tue, 10 Sep 2024 09:28:36 +0200 Subject: [PATCH 08/45] fix: #dev expectedInput typo --- .../components/ai-socket-menu/services/ai-socket.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts index dfded96e..eed892ef 100644 --- a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts +++ b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts @@ -103,7 +103,7 @@ export class AiSocketService { playerId: playerId, state: dataToSend['state'], players: dataToSend['players'], - expected_input: expectedDataToReceive, + expectedInput: expectedDataToReceive, }) ); console.log('Data sent', this._sendingIntervalID as number); From 6a12771b88972417a5f0c2a83274f131e51d441a Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Tue, 10 Sep 2024 12:14:33 +0200 Subject: [PATCH 09/45] feat: #dev outputSpec default to false --- .../components/ai-socket-menu/services/ai-socket.service.ts | 2 +- src/app/game/components/data-menu/data-menu.component.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts index eed892ef..2c2e9f5a 100644 --- a/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts +++ b/src/app/game/components/ai-socket-menu/services/ai-socket.service.ts @@ -106,7 +106,7 @@ export class AiSocketService { expectedInput: expectedDataToReceive, }) ); - console.log('Data sent', this._sendingIntervalID as number); + // console.log('Data sent', this._sendingIntervalID as number); } } } diff --git a/src/app/game/components/data-menu/data-menu.component.ts b/src/app/game/components/data-menu/data-menu.component.ts index be7a9813..6856ba44 100644 --- a/src/app/game/components/data-menu/data-menu.component.ts +++ b/src/app/game/components/data-menu/data-menu.component.ts @@ -83,6 +83,7 @@ export class DataMenuComponent implements OnInit { public ngOnInit(): void { this.dataToPersist = JSON.parse(JSON.stringify(this.dataPossibleToPersist)); this.updateDataToPersistFromURL(); + this.updateURLByDataToPersist('outputSpec', false); } public toggleDataMenu(): void { From 99993164d148727733644a47c4c5aa7ff2c03dca Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Tue, 10 Sep 2024 12:48:14 +0200 Subject: [PATCH 10/45] refactor: #dev data sending base refactor --- .../data-download/data-download.component.ts | 17 ++-------- .../services/game-data-sending.service.ts | 32 ++++++++++++------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.ts index 0de7ae7d..0f100f65 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.ts @@ -44,26 +44,15 @@ export class DataDownloadComponent { public constructor(public gameDataSendingService: GameDataSendingService) {} public sendData(): void { - this.gameDataSendingService.sendGameData(1, this.collectedDataArray); + this.gameDataSendingService + .sendGameData(this.gameName, this.collectedDataArray) + .subscribe(r => console.log(r)); //todo } public generateJSON(): void { this.downloadCsv(JSON.stringify(this.collectedDataArray)); } - public saveData(): void { - this.gameDataSendingService - .sendGameData(1, this.collectedDataArray) - .subscribe({ - next: () => { - console.log('Data saved'); - }, - error: error => { - console.error('Error saving data', error); - }, - }); - } - public deleteCollectedData(): void { this.deleteCollectedDataArrayEmitter.emit(); } diff --git a/src/app/game/components/data-menu/services/game-data-sending.service.ts b/src/app/game/components/data-menu/services/game-data-sending.service.ts index 6ab67005..3df32b38 100644 --- a/src/app/game/components/data-menu/services/game-data-sending.service.ts +++ b/src/app/game/components/data-menu/services/game-data-sending.service.ts @@ -1,7 +1,7 @@ import { inject, Injectable } from '@angular/core'; import { TExchangeData } from '@gameModels/exchange-data.type'; import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { catchError, Observable, throwError } from 'rxjs'; import { environment } from '@env/environment'; @Injectable({ @@ -11,15 +11,25 @@ export class GameDataSendingService { private _httpClient = inject(HttpClient); //maybe need to change location of this service + error handling in service instead of in component - public sendGameData(gameId: number, data: TExchangeData[]): Observable { - return this._httpClient.post( - environment.backendApiUrl + '/api/gamerecord?gameId=' + gameId, - { value: JSON.stringify(data) }, - { - headers: { - Authorization: 'Bearer ' + localStorage.getItem('jwtToken'), - }, - } - ); + public sendGameData( + gameName: string, + data: TExchangeData[] + ): Observable { + return this._httpClient + .post( + environment.backendApiUrl + '/api/gamerecord', + { gameName: gameName, value: JSON.stringify(data) }, + { + headers: { + Authorization: 'Bearer ' + localStorage.getItem('jwtToken'), + }, + } + ) + .pipe( + catchError(error => { + console.error('Error occurred while sending game data:', error); + return throwError(error); + }) + ); } } From 1e47ad4fb2af5f954223304929b001b4dea6c214 Mon Sep 17 00:00:00 2001 From: Marcin Bator Date: Tue, 10 Sep 2024 13:28:39 +0200 Subject: [PATCH 11/45] refactor: #dev data transform --- .../components/data-menu/services/game-data-sending.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/game/components/data-menu/services/game-data-sending.service.ts b/src/app/game/components/data-menu/services/game-data-sending.service.ts index 3df32b38..7d5ccc7c 100644 --- a/src/app/game/components/data-menu/services/game-data-sending.service.ts +++ b/src/app/game/components/data-menu/services/game-data-sending.service.ts @@ -18,7 +18,7 @@ export class GameDataSendingService { return this._httpClient .post( environment.backendApiUrl + '/api/gamerecord', - { gameName: gameName, value: JSON.stringify(data) }, + { gameName: gameName, values: data }, { headers: { Authorization: 'Bearer ' + localStorage.getItem('jwtToken'), From 4ea6b7fbeb3e2032c39e3486ece745ac847dedad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Sun, 15 Sep 2024 14:12:11 +0200 Subject: [PATCH 12/45] fix: #62 deleted unused interface --- src/app/shared/models/user.models.ts | 9 --------- .../endpoints/administration-endpoints.service.ts | 9 +++------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/app/shared/models/user.models.ts b/src/app/shared/models/user.models.ts index 61dafe96..8c4e34a7 100644 --- a/src/app/shared/models/user.models.ts +++ b/src/app/shared/models/user.models.ts @@ -21,12 +21,3 @@ export interface IUserResponse { studyCycleYearA: number; studyCycleYearB: number; } - -export interface IUserDetailsResponse { - id: number; - email: string; - role: TRole; - name: string; - studyCycleYearA: number; - studyCycleYearB: number; -} diff --git a/src/app/shared/services/endpoints/administration-endpoints.service.ts b/src/app/shared/services/endpoints/administration-endpoints.service.ts index 863b546a..63d4d2ca 100644 --- a/src/app/shared/services/endpoints/administration-endpoints.service.ts +++ b/src/app/shared/services/endpoints/administration-endpoints.service.ts @@ -4,10 +4,7 @@ import { environment } from '@env/environment'; import { errorHandler } from '@utils/helpers/errorHandler'; import { jwtTokenAuthHeader } from '@utils/helpers/jwtTokenAuthHeader'; import { TRole } from 'app/shared/models/role.enum'; -import { - IUserDetailsResponse, - IUserResponse, -} from 'app/shared/models/user.models'; +import { IUserResponse } from 'app/shared/models/user.models'; import { catchError, Observable, tap, throwError } from 'rxjs'; @Injectable({ @@ -62,9 +59,9 @@ export class AdministrationEndpointsService { ); } - public getUserDetails(userId: number): Observable { + public getUserDetails(userId: number): Observable { return this._httpClient - .get( + .get( environment.backendApiUrl + `/api/Administration/${userId}/details`, { responseType: 'json', From 5147cc1a391de50ecf03d6ce968bc19f2a73fd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Sun, 15 Sep 2024 14:42:40 +0200 Subject: [PATCH 13/45] feat: #62 added endpoints and models for Game section --- src/app/shared/models/game.models.ts | 16 ++++ src/app/shared/models/user.models.ts | 8 ++ .../endpoints/game-endpoints.service.ts | 85 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/app/shared/models/game.models.ts create mode 100644 src/app/shared/services/endpoints/game-endpoints.service.ts diff --git a/src/app/shared/models/game.models.ts b/src/app/shared/models/game.models.ts new file mode 100644 index 00000000..9c2cf12c --- /dev/null +++ b/src/app/shared/models/game.models.ts @@ -0,0 +1,16 @@ +export interface IGameRequest { + name: string; +} + +export interface IGameResponse { + id: number; + name: string; +} + +export interface IGameStatsResponse { + plays: number; + totalPlayers: number; + totalStorageMb: number; + firstPlayed: string; + lastPlayed: string; +} diff --git a/src/app/shared/models/user.models.ts b/src/app/shared/models/user.models.ts index 8c4e34a7..c047cfd4 100644 --- a/src/app/shared/models/user.models.ts +++ b/src/app/shared/models/user.models.ts @@ -21,3 +21,11 @@ export interface IUserResponse { studyCycleYearA: number; studyCycleYearB: number; } + +export interface IUserStatsResponse { + games: number; + plays: number; + totalStorageMb: number; + firstPlayed: string; + lastPlayed: string; +} diff --git a/src/app/shared/services/endpoints/game-endpoints.service.ts b/src/app/shared/services/endpoints/game-endpoints.service.ts new file mode 100644 index 00000000..3fcd1478 --- /dev/null +++ b/src/app/shared/services/endpoints/game-endpoints.service.ts @@ -0,0 +1,85 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { environment } from '@env/environment'; +import { errorHandler } from '@utils/helpers/errorHandler'; +import { jwtTokenAuthHeader } from '@utils/helpers/jwtTokenAuthHeader'; +import { IGameRequest, IGameResponse } from 'app/shared/models/game.models'; +import { catchError, Observable, tap, throwError } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class GameEndpointsService { + private _httpClient = inject(HttpClient); + + public getGames(): Observable { + return this._httpClient + .get(environment.backendApiUrl + `/api/Game`, { + responseType: 'json', + }) + .pipe( + tap({ + next: () => { + console.log('Games data retrieved successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public addGame(gameData: IGameRequest): Observable { + return this._httpClient + .post(environment.backendApiUrl + `/api/Game`, gameData, { + headers: jwtTokenAuthHeader, + responseType: 'text' as 'json', + }) + .pipe( + tap({ + next: () => { + console.log('Game added successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public updateGame(gameId: number, gameData: IGameRequest): Observable { + return this._httpClient + .put(environment.backendApiUrl + `/api/Game/${gameId}`, gameData, { + headers: jwtTokenAuthHeader, + responseType: 'text' as 'json', + }) + .pipe( + tap({ + next: () => { + console.log('Game updated successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public deleteGame(gameId: number): Observable { + return this._httpClient + .delete(environment.backendApiUrl + `/api/Game/${gameId}`, { + headers: jwtTokenAuthHeader, + responseType: 'text' as 'json', + }) + .pipe( + tap({ + next: () => { + console.log('Game deleted successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } +} From 52931c7103ba125bc8996167af51a491371b06bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Mon, 16 Sep 2024 18:40:48 +0200 Subject: [PATCH 14/45] refactor: #62 player source type enum refactor --- .../game/components/ai-socket-menu/ai-socket-menu.component.ts | 2 +- .../components/player-socket-connection-menu.component.ts | 2 +- src/app/game/components/player-menu/player-menu.component.ts | 2 +- src/app/game/game.page.component.ts | 2 +- src/app/game/games/pong/pong.component.ts | 2 +- src/app/game/models/player.class.ts | 2 +- src/app/{game => shared}/models/player-source-type.enum.ts | 0 7 files changed, 6 insertions(+), 6 deletions(-) rename src/app/{game => shared}/models/player-source-type.enum.ts (100%) diff --git a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts index 82188a8d..95908fd4 100644 --- a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.ts @@ -5,7 +5,7 @@ import { SocketConnectedMenuComponent } from './components/components/components import { DebugModeMenuComponent } from './components/components/components/debug-mode-menu/debug-mode-menu.component'; import { DebugModePanelComponent } from './components/components/components/debug-mode-panel/debug-mode-panel.component'; import { Player } from '@gameModels/player.class'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; import { PlayerSocketMenuComponent } from './components/player-socket-menu.component'; import { Observable, Subscription } from 'rxjs'; diff --git a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts index 5c288253..f8851b4c 100644 --- a/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts +++ b/src/app/game/components/ai-socket-menu/components/components/player-socket-connection-menu.component.ts @@ -9,7 +9,7 @@ import { } from '@angular/core'; import { AiSocketService } from '../../services/ai-socket.service'; import { TExchangeData } from '@gameModels/exchange-data.type'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; import { Player } from '@gameModels/player.class'; import { SocketDomainInputComponent } from './components/socket-domain-input/socket-domain-input.component'; import { SocketConnectedMenuComponent } from './components/socket-connected-menu/socket-connected-menu.component'; diff --git a/src/app/game/components/player-menu/player-menu.component.ts b/src/app/game/components/player-menu/player-menu.component.ts index 3a95f22d..29beb4cb 100644 --- a/src/app/game/components/player-menu/player-menu.component.ts +++ b/src/app/game/components/player-menu/player-menu.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; import { Player } from '@gameModels/player.class'; @Component({ diff --git a/src/app/game/game.page.component.ts b/src/app/game/game.page.component.ts index d898f3ef..870bd440 100644 --- a/src/app/game/game.page.component.ts +++ b/src/app/game/game.page.component.ts @@ -9,7 +9,7 @@ import { AuthRequiredDirective } from '@utils/directives/auth-required.directive import { Subject, Subscription } from 'rxjs'; import { Player } from '@gameModels/player.class'; import { PlayerMenuComponent } from './components/player-menu/player-menu.component'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; import { games } from './data/games'; import { ActivatedRoute, Router, NavigationStart } from '@angular/router'; import { GameMenuComponent } from './components/game-menu/game-menu.component'; diff --git a/src/app/game/games/pong/pong.component.ts b/src/app/game/games/pong/pong.component.ts index 08fcc335..e992fcf9 100644 --- a/src/app/game/games/pong/pong.component.ts +++ b/src/app/game/games/pong/pong.component.ts @@ -2,7 +2,7 @@ /* eslint-disable max-lines */ import { AfterViewInit, Component, OnDestroy, OnInit } from '@angular/core'; import { CanvasComponent } from '../../components/canvas/canvas.component'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; import { BaseGameWindowComponent } from '../base-game.component'; import { Pong } from './models/pong.class'; diff --git a/src/app/game/models/player.class.ts b/src/app/game/models/player.class.ts index 30c17a0b..e0acf7cf 100644 --- a/src/app/game/models/player.class.ts +++ b/src/app/game/models/player.class.ts @@ -1,5 +1,5 @@ import { TExchangeData } from '@gameModels/exchange-data.type'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; export class Player { public id: number; diff --git a/src/app/game/models/player-source-type.enum.ts b/src/app/shared/models/player-source-type.enum.ts similarity index 100% rename from src/app/game/models/player-source-type.enum.ts rename to src/app/shared/models/player-source-type.enum.ts From b72d62c96b290de89699f07508ed5f8971c0fdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Mon, 16 Sep 2024 19:13:16 +0200 Subject: [PATCH 15/45] feat: #62 add all missing schemas --- .../ai-socket-menu.component.spec.ts | 2 +- .../player-socket-menu.component.spec.ts | 2 +- .../player-menu/player-menu.component.spec.ts | 2 +- src/app/shared/models/player.models.ts | 12 ++++++++++ src/app/shared/models/recorded-game.models.ts | 24 +++++++++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/app/shared/models/player.models.ts create mode 100644 src/app/shared/models/recorded-game.models.ts diff --git a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts index bc4ac792..f9b26b7b 100644 --- a/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts +++ b/src/app/game/components/ai-socket-menu/ai-socket-menu.component.spec.ts @@ -3,8 +3,8 @@ import { By } from '@angular/platform-browser'; import { AiSocketMenuComponent } from './ai-socket-menu.component'; import { Component, Input, Output, EventEmitter } from '@angular/core'; import { TExchangeData } from '@gameModels/exchange-data.type'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { Player } from '@gameModels/player.class'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; @Component({ selector: 'app-player-socket-menu', diff --git a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts index 94664ec2..b1bc6fb1 100644 --- a/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts +++ b/src/app/game/components/ai-socket-menu/components/player-socket-menu.component.spec.ts @@ -7,7 +7,7 @@ import { SocketDomainInputComponent } from './components/components/socket-domai import { SocketConnectedMenuComponent } from './components/components/socket-connected-menu/socket-connected-menu.component'; import { AiSocketService } from '../services/ai-socket.service'; import { By } from '@angular/platform-browser'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; describe('PlayerSocketMenuComponent', () => { let component: PlayerSocketMenuComponent; diff --git a/src/app/game/components/player-menu/player-menu.component.spec.ts b/src/app/game/components/player-menu/player-menu.component.spec.ts index 82922b2a..2ee97980 100644 --- a/src/app/game/components/player-menu/player-menu.component.spec.ts +++ b/src/app/game/components/player-menu/player-menu.component.spec.ts @@ -1,9 +1,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PlayerMenuComponent } from './player-menu.component'; import { By } from '@angular/platform-browser'; -import { PlayerSourceType } from '@gameModels/player-source-type.enum'; import { Player } from '@gameModels/player.class'; import { AiSocketService } from '../ai-socket-menu/services/ai-socket.service'; +import { PlayerSourceType } from 'app/shared/models/player-source-type.enum'; describe('PlayerMenuComponent', () => { let component: PlayerMenuComponent; diff --git a/src/app/shared/models/player.models.ts b/src/app/shared/models/player.models.ts new file mode 100644 index 00000000..3be49113 --- /dev/null +++ b/src/app/shared/models/player.models.ts @@ -0,0 +1,12 @@ +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { PlayerSourceType } from './player-source-type.enum'; + +export interface IPlayer { + id: number; + name: string; + isObligatory: boolean; + isActive: boolean; + playerType: PlayerSourceType; + inputData: TExchangeData; + expectedDataDescription: string; +} diff --git a/src/app/shared/models/recorded-game.models.ts b/src/app/shared/models/recorded-game.models.ts new file mode 100644 index 00000000..831b9192 --- /dev/null +++ b/src/app/shared/models/recorded-game.models.ts @@ -0,0 +1,24 @@ +import { TExchangeData } from '@gameModels/exchange-data.type'; +import { IPlayer } from './player.models'; + +export interface IRecordedGameValue { + name: string; + state: TExchangeData; + players: IPlayer[]; + timestamp: string; + outputSpec: string; +} + +export interface IRecordedGameResponse { + id: number; + players: IPlayer[]; + started: string; + ended: string; + outputSpec: string; + endState: TExchangeData; +} + +export interface IRecordedGameRequest { + gameName: string; + values: IRecordedGameValue[]; +} From 285199d700eff2bb39750813cf1e89e8e3efc661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Mon, 16 Sep 2024 19:54:04 +0200 Subject: [PATCH 16/45] feat: #62 added gameRecord endpoints --- .../data-download/data-download.component.ts | 14 ++- .../services/game-data-sending.service.ts | 35 ------ src/app/shared/models/recorded-game.models.ts | 11 +- .../game-record-endpoints.service.ts | 109 ++++++++++++++++++ 4 files changed, 119 insertions(+), 50 deletions(-) delete mode 100644 src/app/game/components/data-menu/services/game-data-sending.service.ts create mode 100644 src/app/shared/services/endpoints/game-record-endpoints.service.ts diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.ts index 0f100f65..f0800427 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.ts @@ -1,6 +1,7 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { GameDataSendingService } from '../../services/game-data-sending.service'; +import { Component, EventEmitter, inject, Input, Output } from '@angular/core'; +import { GameRecordEndpointsService } from '@endpoints/game-record-endpoints.service'; import { TExchangeData } from '@gameModels/exchange-data.type'; +import { IRecordedGameRequest } from 'app/shared/models/recorded-game.models'; @Component({ selector: 'app-data-download', @@ -41,11 +42,14 @@ export class DataDownloadComponent { @Output() public deleteCollectedDataArrayEmitter = new EventEmitter(); - public constructor(public gameDataSendingService: GameDataSendingService) {} + private _gameRecordEndpointsService = inject(GameRecordEndpointsService); public sendData(): void { - this.gameDataSendingService - .sendGameData(this.gameName, this.collectedDataArray) + const gameRecordData: IRecordedGameRequest[] = [ + { gameName: this.gameName, values: this.collectedDataArray }, + ]; + this._gameRecordEndpointsService + .addGameRecording(gameRecordData) .subscribe(r => console.log(r)); //todo } diff --git a/src/app/game/components/data-menu/services/game-data-sending.service.ts b/src/app/game/components/data-menu/services/game-data-sending.service.ts deleted file mode 100644 index 7d5ccc7c..00000000 --- a/src/app/game/components/data-menu/services/game-data-sending.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { TExchangeData } from '@gameModels/exchange-data.type'; -import { HttpClient } from '@angular/common/http'; -import { catchError, Observable, throwError } from 'rxjs'; -import { environment } from '@env/environment'; - -@Injectable({ - providedIn: 'root', -}) -export class GameDataSendingService { - private _httpClient = inject(HttpClient); - - //maybe need to change location of this service + error handling in service instead of in component - public sendGameData( - gameName: string, - data: TExchangeData[] - ): Observable { - return this._httpClient - .post( - environment.backendApiUrl + '/api/gamerecord', - { gameName: gameName, values: data }, - { - headers: { - Authorization: 'Bearer ' + localStorage.getItem('jwtToken'), - }, - } - ) - .pipe( - catchError(error => { - console.error('Error occurred while sending game data:', error); - return throwError(error); - }) - ); - } -} diff --git a/src/app/shared/models/recorded-game.models.ts b/src/app/shared/models/recorded-game.models.ts index 831b9192..13d06e6a 100644 --- a/src/app/shared/models/recorded-game.models.ts +++ b/src/app/shared/models/recorded-game.models.ts @@ -1,14 +1,5 @@ import { TExchangeData } from '@gameModels/exchange-data.type'; import { IPlayer } from './player.models'; - -export interface IRecordedGameValue { - name: string; - state: TExchangeData; - players: IPlayer[]; - timestamp: string; - outputSpec: string; -} - export interface IRecordedGameResponse { id: number; players: IPlayer[]; @@ -20,5 +11,5 @@ export interface IRecordedGameResponse { export interface IRecordedGameRequest { gameName: string; - values: IRecordedGameValue[]; + values: TExchangeData[]; } diff --git a/src/app/shared/services/endpoints/game-record-endpoints.service.ts b/src/app/shared/services/endpoints/game-record-endpoints.service.ts new file mode 100644 index 00000000..3589f2cd --- /dev/null +++ b/src/app/shared/services/endpoints/game-record-endpoints.service.ts @@ -0,0 +1,109 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { environment } from '@env/environment'; +import { errorHandler } from '@utils/helpers/errorHandler'; +import { jwtTokenAuthHeader } from '@utils/helpers/jwtTokenAuthHeader'; +import { + IRecordedGameRequest, + IRecordedGameResponse, +} from 'app/shared/models/recorded-game.models'; +import { catchError, Observable, tap, throwError } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class GameRecordEndpointsService { + private _httpClient = inject(HttpClient); + + public getAllRecordedGames( + gameId: number + ): Observable { + return this._httpClient + .get( + environment.backendApiUrl + `/api/GameRecord?gameId=${gameId}`, + { + headers: jwtTokenAuthHeader, + responseType: 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('Game records data retrieved successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public addGameRecording( + gameRecordData: IRecordedGameRequest[] + ): Observable { + return this._httpClient + .post( + environment.backendApiUrl + `/api/GameRecord`, + gameRecordData, + { + headers: jwtTokenAuthHeader, + responseType: 'text' as 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('Game recording added successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public deleteGameRecording(recordedGameId: number): Observable { + return this._httpClient + .delete( + environment.backendApiUrl + + `/api/GameRecord?recordedGameId=${recordedGameId}`, + { + headers: jwtTokenAuthHeader, + responseType: 'text' as 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('Game recording deleted successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public downloadSpecificRecordedGame( + recordedGameId: number + ): Observable { + return this._httpClient + .get( + environment.backendApiUrl + `/api/GameRecord/${recordedGameId}`, + { + headers: jwtTokenAuthHeader, + responseType: 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('Recorded game downloaded successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } +} From cdf4cad850d20d8e52bf324dfa7dcb2106b6075f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Tue, 17 Sep 2024 20:30:43 +0200 Subject: [PATCH 17/45] feat: #62 added stats endpoints --- .../endpoints/stats-endpoints.service.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/app/shared/services/endpoints/stats-endpoints.service.ts diff --git a/src/app/shared/services/endpoints/stats-endpoints.service.ts b/src/app/shared/services/endpoints/stats-endpoints.service.ts new file mode 100644 index 00000000..7b9b49f1 --- /dev/null +++ b/src/app/shared/services/endpoints/stats-endpoints.service.ts @@ -0,0 +1,56 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { environment } from '@env/environment'; +import { errorHandler } from '@utils/helpers/errorHandler'; +import { jwtTokenAuthHeader } from '@utils/helpers/jwtTokenAuthHeader'; +import { IGameStatsResponse } from 'app/shared/models/game.models'; +import { IUserStatsResponse } from 'app/shared/models/user.models'; +import { catchError, Observable, tap, throwError } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class StatsEndpointsService { + private _httpClient = inject(HttpClient); + + public getAllRecordedGames(userId: number): Observable { + return this._httpClient + .get( + environment.backendApiUrl + `/api/Stats/user?userId=${userId}`, + { + headers: jwtTokenAuthHeader, + responseType: 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('User stats data retrieved successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } + + public getGameStats(gameId: number): Observable { + return this._httpClient + .get( + environment.backendApiUrl + `/api/Stats/game?gameId=${gameId}`, + { + responseType: 'json', + } + ) + .pipe( + tap({ + next: () => { + console.log('Game stats data retrieved successfully'); + }, + }), + catchError((error: HttpErrorResponse) => { + return throwError(() => errorHandler(error)); + }) + ); + } +} From c0a42b414903a5a739a8bae1f61b03a2d29e9a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Tue, 17 Sep 2024 20:36:51 +0200 Subject: [PATCH 18/45] fix: #dev fix tests url --- .../components/data-download/data-download.component.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts index 400f504b..84faeda5 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.spec.ts @@ -1,11 +1,11 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DataDownloadComponent } from './data-download.component'; -import { GameDataSendingService } from '../../services/game-data-sending.service'; import { DataTransformService } from 'app/shared/services/data-transform.service'; import { TExchangeData } from '@gameModels/exchange-data.type'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; import { HttpClient, HttpHandler } from '@angular/common/http'; +import { GameRecordEndpointsService } from '@endpoints/game-record-endpoints.service'; describe('DataDownloadComponent', () => { let component: DataDownloadComponent; @@ -15,7 +15,7 @@ describe('DataDownloadComponent', () => { await TestBed.configureTestingModule({ imports: [DataDownloadComponent], providers: [ - GameDataSendingService, + GameRecordEndpointsService, DataTransformService, HttpClient, HttpHandler, From c3f1ed22fb6b42ee74652b937148a016f8b6d6d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Wed, 18 Sep 2024 19:15:56 +0200 Subject: [PATCH 19/45] feat: #46 auto game data save with erorr handling --- .../data-download/data-download.component.ts | 37 ++++++++++++------- .../game-record-endpoints.service.ts | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/app/game/components/data-menu/components/data-download/data-download.component.ts b/src/app/game/components/data-menu/components/data-download/data-download.component.ts index f0800427..d6dd8fe9 100644 --- a/src/app/game/components/data-menu/components/data-download/data-download.component.ts +++ b/src/app/game/components/data-menu/components/data-download/data-download.component.ts @@ -2,6 +2,7 @@ import { Component, EventEmitter, inject, Input, Output } from '@angular/core'; import { GameRecordEndpointsService } from '@endpoints/game-record-endpoints.service'; import { TExchangeData } from '@gameModels/exchange-data.type'; import { IRecordedGameRequest } from 'app/shared/models/recorded-game.models'; +import { NotificationService } from 'app/shared/services/notification.service'; @Component({ selector: 'app-data-download', @@ -9,7 +10,7 @@ import { IRecordedGameRequest } from 'app/shared/models/recorded-game.models'; template: `
- @@ -90,6 +92,8 @@ export class LoginFormComponent implements OnDestroy { private _loginSubscription: Subscription | null = null; private _resendEmailSubscription: Subscription | null = null; + public isLoginClicked = false; + public errorMessage: string | null = null; public resendMessage = ''; @@ -111,12 +115,20 @@ export class LoginFormComponent implements OnDestroy { .login(userLoginRequest) .subscribe({ next: (response: string) => { + this.isLoginClicked = true; localStorage.setItem('jwtToken', response); this._authService.setAuthStatus(true); - this._router.navigate(['/']); - this.errorMessage = null; + setTimeout(() => { + this._router.navigate(['/']); + this.errorMessage = null; + this._notificationService.addNotification( + "You've been logged in successfully!", + 3000 + ); + }, 3000); }, error: (error: string) => { + this.isLoginClicked = false; this._authService.setAuthStatus(false); this.errorMessage = error; }, From e43f6139dc541b8a93038ca46542bf93e429e060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Buczek?= Date: Thu, 26 Sep 2024 01:36:29 +0200 Subject: [PATCH 36/45] feat: #71 added waiting cursor and emails history --- .../shared/services/authentication.service.ts | 2 +- .../login/components/login-form.component.ts | 44 ++++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/app/shared/services/authentication.service.ts b/src/app/shared/services/authentication.service.ts index 92a0b7b3..f5120687 100644 --- a/src/app/shared/services/authentication.service.ts +++ b/src/app/shared/services/authentication.service.ts @@ -56,7 +56,7 @@ export class AuthenticationService implements OnDestroy { if (isAuthenticated) { setTimeout(() => { this.loadCurrentUser(); - }, 3000); + }, 5000); } } diff --git a/src/app/user-workflow/login/components/login-form.component.ts b/src/app/user-workflow/login/components/login-form.component.ts index eb95b78c..452c1c2d 100644 --- a/src/app/user-workflow/login/components/login-form.component.ts +++ b/src/app/user-workflow/login/components/login-form.component.ts @@ -1,4 +1,4 @@ -import { Component, inject, OnDestroy } from '@angular/core'; +import { Component, inject, OnDestroy, OnInit } from '@angular/core'; import { NonNullableFormBuilder, ReactiveFormsModule, @@ -32,7 +32,13 @@ import { AuthenticationService } from 'app/shared/services/authentication.servic type="email" formControlName="email" placeholder="Type your email" - class="custom-input" /> + class="custom-input" + list="recentEmails" /> + + @for (email of recentEmails; track email) { + + } +