From 4797a3ee53ec0fa5e27802977222d7fdd0134350 Mon Sep 17 00:00:00 2001 From: ExostFlash Date: Tue, 3 Jun 2025 10:54:50 +0200 Subject: [PATCH] Fonctionne git add .git add . --- .../fencerjudgeback/entities/MatchBean.kt | 2 +- .../restControllers/MatchRestController.kt | 2 +- .../controllers/RefereeWebSocketController.kt | 2 +- .../websocket/models/MatchUpdateMessage.kt | 3 +- .../websocket/models/RefereeUpdateMessage.kt | 5 +- .../src/app/interfaces/matches.ts | 6 +- .../app/services/matches/matches.service.ts | 117 ++++-------------- db.mv.db | Bin 32768 -> 32768 bytes 8 files changed, 32 insertions(+), 105 deletions(-) diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt index ae1fe3a..f37c7fd 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt @@ -11,7 +11,7 @@ import java.util.Date enum class MatchState { ONGOING, - FINISHED, + OVER, NOT_STARTED } diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt index 8e4da4e..ab2e7de 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt @@ -55,7 +55,7 @@ class MatchRestController(private val matchService: MatchService) { // Lister les matchs terminés @GetMapping("/over") fun getAllFinished(): ResponseEntity?> { - return ResponseEntity.ok(matchService.getAll().filter { it.state == MatchState.FINISHED }) + return ResponseEntity.ok(matchService.getAll().filter { it.state == MatchState.OVER }) } // Lister les matchs non commencés diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/controllers/RefereeWebSocketController.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/controllers/RefereeWebSocketController.kt index 6064fda..792fdc1 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/controllers/RefereeWebSocketController.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/controllers/RefereeWebSocketController.kt @@ -30,7 +30,7 @@ class RefereeWebSocketController( id = refereeUpdateMessage.refereeId, name = refereeUpdateMessage.name, firstName = refereeUpdateMessage.firstName, - qualification = refereeUpdateMessage.qualification + level = refereeUpdateMessage.level ) // Update the referee in the database diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/MatchUpdateMessage.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/MatchUpdateMessage.kt index 028845f..f30aef3 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/MatchUpdateMessage.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/MatchUpdateMessage.kt @@ -1,6 +1,7 @@ package fr.teamflash.fencerjudgeback.websocket.models import fr.teamflash.fencerjudgeback.entities.MatchBean +import java.util.* /** * Message model for match updates sent through WebSocket @@ -12,7 +13,7 @@ data class MatchUpdateMessage( val refereeId: Long?, val score1: Int, val score2: Int, - val date: String?, + val date: Date?, val type: UpdateType = UpdateType.SCORE_UPDATE ) { enum class UpdateType { diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/RefereeUpdateMessage.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/RefereeUpdateMessage.kt index cb9c1be..12f0fdd 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/RefereeUpdateMessage.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/websocket/models/RefereeUpdateMessage.kt @@ -1,6 +1,7 @@ package fr.teamflash.fencerjudgeback.websocket.models import fr.teamflash.fencerjudgeback.entities.RefereeBean +import fr.teamflash.fencerjudgeback.entities.RefereeLevel /** * Message model for referee updates sent through WebSocket @@ -9,7 +10,7 @@ data class RefereeUpdateMessage( val refereeId: Long, val name: String?, val firstName: String?, - val qualification: String?, + val level: RefereeLevel?, val type: UpdateType = UpdateType.REFEREE_UPDATE ) { enum class UpdateType { @@ -27,7 +28,7 @@ data class RefereeUpdateMessage( refereeId = refereeBean.id ?: 0, name = refereeBean.name, firstName = refereeBean.firstName, - qualification = refereeBean.qualification, + level = refereeBean.level, type = type ) } diff --git a/FencerJudgeFront/src/app/interfaces/matches.ts b/FencerJudgeFront/src/app/interfaces/matches.ts index 26c6767..1437a58 100644 --- a/FencerJudgeFront/src/app/interfaces/matches.ts +++ b/FencerJudgeFront/src/app/interfaces/matches.ts @@ -1,7 +1,7 @@ export enum MatchState { - ONGOING = 1, - OVER = 2, - NOT_STARTED = 3, + ONGOING = 0, + OVER = 1, + NOT_STARTED = 2, } export interface Matches { diff --git a/FencerJudgeFront/src/app/services/matches/matches.service.ts b/FencerJudgeFront/src/app/services/matches/matches.service.ts index 9f3fdeb..bbffd36 100644 --- a/FencerJudgeFront/src/app/services/matches/matches.service.ts +++ b/FencerJudgeFront/src/app/services/matches/matches.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable, Subject, BehaviorSubject, of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { Matches, MatchState } from '@interfaces/matches'; @Injectable({ providedIn: 'root' }) @@ -46,115 +45,41 @@ export class MatchesService { state: MatchState.NOT_STARTED, }, ]; - private socket?: WebSocket; - private apiUrl = 'http://localhost:8080'; - private matchUpdates$ = new Subject(); - private allMatches: Matches[] = []; private nextMatchId = Math.max(...this.matches.map((m) => m.id)) + 1; - constructor(private http: HttpClient) { - this.sendCurrentMatches(); - } - - public sendCurrentMatches(): void { - if (!this.matches || this.matches.length === 0) { - console.warn('[HTTP] ⚠️ Aucun match à envoyer.'); - return; - } - - const headers = { - headers: { - 'Content-Type': 'application/json', - }, - }; - - this.matches.forEach((match) => { - this.http - .post( - this.apiUrl + '/matches/create-match', - JSON.stringify(match), - headers - ) - .subscribe({ - next: (response) => { - console.log('[HTTP] ✅ Match envoyé avec succès :', response); - }, - error: (error) => { - console.error( - '[HTTP] ❌ Erreur lors de l’envoi d’un match :', - error - ); - }, - }); - }); - } - - private connectToMatchUpdatesWebSocket(): void { - const wsUrl = 'http://localhost:8080/ws'; - this.socket = new WebSocket(wsUrl); - - this.socket.onopen = () => { - console.log('[WebSocket] ✅ Connecté à', wsUrl); - }; - - this.socket.onmessage = (event) => { - try { - const data = JSON.parse(event.data) as Matches[]; - console.log('[WebSocket] 📥 Données reçues :', data); - this.matchUpdates$.next(data); - } catch (e) { - console.error('[WebSocket] ❌ Erreur de parsing JSON', e); - } - }; - - this.socket.onerror = (err) => { - console.error('[WebSocket] ❌ Erreur :', err); - }; - - this.socket.onclose = () => { - console.warn('[WebSocket] 🔌 Fermeture de la connexion'); - }; - } - - private sendMatchesToWebSocket(): void { - if (this.socket && this.socket.readyState === WebSocket.OPEN) { - const dataToSend = JSON.stringify(this.matches); - this.socket.send(dataToSend); - console.log('[WebSocket] 📤 Données envoyées :', dataToSend); - } else { - console.warn("[WebSocket] ⚠️ Le WebSocket n'est pas encore ouvert."); - } + constructor() { + console.log('[MatchesService] Initial matches loaded:', this.matches); } getMatches(): Observable { - return this.matchUpdates$.asObservable(); + console.log('[MatchesService] Fetching all matches'); + return of(this.matches); } getMatchById(id: number): Observable { - const match = this.allMatches.find((m) => m.id === id); - console.log(`[MatchesService] Match ID ${id} récupéré :`, match); - return new BehaviorSubject(match).asObservable(); + const match = this.matches.find((m) => m.id === id); + console.log(`[MatchesService] Fetching match ID: ${id}`, match); + return of(match); + } + + // Préparation future pour WebSocket + connectToMatchUpdatesWebSocket(): void { + console.log( + '[MatchesService] WebSocket connection placeholder initialized' + ); + // ici tu pourrais plus tard faire : this.socket = new WebSocket('ws://...') etc. } updateMatch(id: number, updatedData: Partial): void { - const matchIndex = this.allMatches.findIndex((m) => m.id === id); - if (matchIndex !== -1) { - const updatedMatch = { ...this.allMatches[matchIndex], ...updatedData }; - this.allMatches[matchIndex] = updatedMatch; - this.matchUpdates$.next([...this.allMatches]); // émettre un nouveau tableau - console.log( - `[MatchesService] Match ${id} mis à jour localement :`, - updatedMatch - ); + const match = this.matches.find((m) => m.id === id); + if (match) { + Object.assign(match, updatedData); + console.log(`[MatchesService] Match ${id} mis à jour :`, match); } else { - console.warn(`[MatchesService] Match ${id} non trouvé pour mise à jour`); + console.warn(`[MatchesService] Match ${id} introuvable`); } } - ngOnDestroy(): void { - this.socket?.close(); - } - create(match: Omit): Observable { const newMatch: Matches = { ...match, diff --git a/db.mv.db b/db.mv.db index 632875e3e12c2e420d446e39debffca4dafa5586..13d536ba314fcc2675be1669753f4b8bbb2700ce 100644 GIT binary patch literal 32768 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 literal 32768 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 U#-yYCe@`