From 1d97283343fa894ce3c7d18018f2137980800c68 Mon Sep 17 00:00:00 2001 From: pedro Date: Mon, 2 Jun 2025 13:38:14 +0200 Subject: [PATCH] =?UTF-8?q?entit=C3=A9s,=20services=20et=20restcontrollers?= =?UTF-8?q?=20fonctionnels;=20websocket=20=C3=A0=20int=C3=A9grer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FencerJudgeBack/TODO.txt | 4 +- FencerJudgeBack/build.gradle.kts | 5 +- .../fencerjudgeback/entities/MatchBean.kt | 20 ++- .../fencerjudgeback/entities/PlayerBean.kt | 6 +- .../fencerjudgeback/entities/RefereeBean.kt | 6 +- .../restControllers/MatchRestController.kt | 43 ++++-- .../restControllers/PlayerRestController.kt | 41 +++--- .../restControllers/RefereeRestController.kt | 28 ++-- .../fencerjudgeback/services/MatchService.kt | 80 ++++------ .../fencerjudgeback/services/PlayerService.kt | 48 +++--- .../services/RefereeService.kt | 33 +++-- .../src/main/resources/application.properties | 15 ++ FencerJudgeBack/test.http | 138 ++++++++++++++++++ 13 files changed, 332 insertions(+), 135 deletions(-) create mode 100644 FencerJudgeBack/test.http diff --git a/FencerJudgeBack/TODO.txt b/FencerJudgeBack/TODO.txt index d5b5baa..f214c4a 100644 --- a/FencerJudgeBack/TODO.txt +++ b/FencerJudgeBack/TODO.txt @@ -1,4 +1,6 @@ corriger les services - ~ tester les restcontrollers via des requêtes http - ~ créer la bdd avec toutes les tables (repositories) -tester le websocket \ No newline at end of file +tester le websocket +prévoir l'utilisation en admin uniquement (spring security) +faire le jackarta de l'api \ No newline at end of file diff --git a/FencerJudgeBack/build.gradle.kts b/FencerJudgeBack/build.gradle.kts index 4962b18..f64df6d 100644 --- a/FencerJudgeBack/build.gradle.kts +++ b/FencerJudgeBack/build.gradle.kts @@ -27,13 +27,16 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") testRuntimeOnly("org.junit.platform:junit-platform-launcher") + implementation("org.springframework.boot:spring-boot-starter-validation") // WEBSOCKET implementation("org.springframework.boot:spring-boot-starter-websocket") // SECURITY - implementation("org.springframework.boot:spring-boot-starter-security") +// implementation("org.springframework.boot:spring-boot-starter-security") + // H2 Database + runtimeOnly("com.h2database:h2") } kotlin { 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 3955ef5..f6d03e7 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/MatchBean.kt @@ -1,19 +1,33 @@ package fr.teamflash.fencerjudgeback.entities import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType import jakarta.persistence.Id +import jakarta.persistence.SequenceGenerator import jakarta.persistence.Table -import java.util.Date +import jakarta.validation.constraints.* @Entity -@Table(name="matchs") +@Table(name="matches") data class MatchBean( + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "match_sequence") + @SequenceGenerator(name = "match_sequence", sequenceName = "match_seq", allocationSize = 1) val id:Long?=null, + val weapon:String?=null, + val country:String?=null, + val city:String?=null, + @field:NotNull(message = "Player 1 ID must not be null") val player1ID:Long?=null, + @field:NotNull(message = "Player 2 ID must not be null") val player2ID:Long?=null, val refereeID: Long?=null, + @field:Min(value = 0, message = "Score must be at least 0") val score1:Int=0, + @field:Min(value = 0, message = "Score must be at least 0") val score2:Int=0, - val date: Date?=null + val date: String?=null, + val state:String?=null ) diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/PlayerBean.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/PlayerBean.kt index f349348..4033340 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/PlayerBean.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/PlayerBean.kt @@ -4,13 +4,17 @@ import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue import jakarta.persistence.GenerationType import jakarta.persistence.Id +import jakarta.persistence.SequenceGenerator import jakarta.persistence.Table @Entity @Table(name="players") data class PlayerBean( @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "player_sequence") + @SequenceGenerator(name = "player_sequence", sequenceName = "player_seq", allocationSize = 1) val id:Long?=null, val name:String?="", - val firstName:String?="" + val firstName:String?="", + val club:String?="" ) \ No newline at end of file diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/RefereeBean.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/RefereeBean.kt index 5511a69..4756fee 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/RefereeBean.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/entities/RefereeBean.kt @@ -4,13 +4,17 @@ import jakarta.persistence.Entity import jakarta.persistence.GeneratedValue import jakarta.persistence.GenerationType import jakarta.persistence.Id +import jakarta.persistence.SequenceGenerator import jakarta.persistence.Table @Entity @Table(name="referees") data class RefereeBean( @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "referee_sequence") + @SequenceGenerator(name = "referee_sequence", sequenceName = "referee_seq", allocationSize = 1) val id:Long?=null, val name:String?=null, - val firstName:String?=null + val firstName:String?=null, + val qualification:String?=null ) \ No newline at end of file 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 1775fc4..0957c00 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/MatchRestController.kt @@ -2,10 +2,8 @@ package fr.teamflash.fencerjudgeback.restControllers import fr.teamflash.fencerjudgeback.entities.MatchBean import fr.teamflash.fencerjudgeback.services.MatchService -import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* -import kotlin.random.Random @RestController @RequestMapping("/matches") @@ -13,55 +11,74 @@ class MatchRestController(private val matchService: MatchService) { // Lister tous les matchs @GetMapping("/") - fun getAll(): ResponseEntity> { + fun getAll(): ResponseEntity?> { return ResponseEntity.ok(matchService.getAll()) } // Lister tous les matchs à partir d'une certaine date - @GetMapping("/{date}") - fun getAllFromDate(date:Date): ResponseEntity?> { + @GetMapping("/date/{date}") + fun getAllFromDate(@PathVariable date:String): ResponseEntity?> { return ResponseEntity.ok(matchService.getAll().filter { it.date == date }) } + // Lister tous les matchs par pays + @GetMapping("/country/{country}") + fun getAllFromCountry(@PathVariable country:String): ResponseEntity?> { + return ResponseEntity.ok(matchService.getAll().filter { it.country == country }) + } + + // Lister tous les matchs par ville + @GetMapping("/city/{city}") + fun getAllFromCity(@PathVariable city:String): ResponseEntity?> { + return ResponseEntity.ok(matchService.getAll().filter { it.city == city }) + } + + // Lister tous les matchs par joueurs + @GetMapping("/players/{player1ID}/{player2ID}") + fun getAllWithPlayers(@PathVariable player1ID: Long?, @PathVariable player2ID: Long?): ResponseEntity?> { + return ResponseEntity.ok(matchService.getByPlayers(player1ID, player2ID)) + } + // Lister les matchs en cours @GetMapping("/active") fun getAllActive(): ResponseEntity?> { - return ResponseEntity.ok(matchService.getAll().filter { it.state == ACTIVE }) + return ResponseEntity.ok(matchService.getAll().filter { it.state == "ACTIVE" }) } // Lister les matchs terminés @GetMapping("/over") fun getAllFinished(): ResponseEntity?> { - return ResponseEntity.ok(matchService.getAll().filter { }) + return ResponseEntity.ok(matchService.getAll().filter { it.state == "FINISHED" }) } // Lister les matchs non commencés @GetMapping("/not-started") fun getAllNotStarted(): ResponseEntity?> { - + return ResponseEntity.ok(matchService.getAll().filter { it.state == "NOT STARTED" }) } // Afficher un match par id @GetMapping("/{id}") - fun getMatchById(@PathVariable id: Long): ResponseEntity { + fun getById(@PathVariable id: Long): ResponseEntity { return ResponseEntity.ok(matchService.getById(id)) } // Ajouter un match @PostMapping("/create-match") fun createMatch(@RequestBody match: MatchBean): ResponseEntity { - return ResponseEntity.status(HttpStatus.CREATED).body(matchService.createMatch(match)) +// return ResponseEntity.status(HttpStatus.CREATED).body(matchService.createMatch(match)) + return ResponseEntity.ok(matchService.createMatch(match)) } // Mettre à jour un match @PutMapping("/update-match/{id}") - fun updateMatch(@PathVariable id: Long, @RequestBody refereeID: Long, @RequestBody): ResponseEntity { - return ResponseEntity.ok(matchService.updateMatch(match)) + fun updateMatch(@PathVariable id: Long, @RequestBody match: MatchBean): ResponseEntity { + return ResponseEntity.ok(matchService.updateMatch(id, match)) } // Supprimer un match @DeleteMapping("/delete-match/{id}") fun deleteMatch(@PathVariable id: Long): ResponseEntity { - return ResponseEntity.ok(matchService.deleteMatch(id)) + return ResponseEntity.ok(matchService.deleteMatchById(id)) } } diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/PlayerRestController.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/PlayerRestController.kt index a32d39b..699c557 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/PlayerRestController.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/PlayerRestController.kt @@ -5,55 +5,62 @@ import fr.teamflash.fencerjudgeback.services.PlayerService import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -import java.util.Optional @RestController @RequestMapping("/players") class PlayerRestController(private val playerService: PlayerService) { // Lister tous les joueurs - @GetMapping + @GetMapping("/") fun getAll(): ResponseEntity> { return ResponseEntity.ok(playerService.getAll()) } // Afficher un joueur par id @GetMapping("/{id}") - fun getById(id: Long): ResponseEntity?> { + fun getById(@PathVariable id: Long): ResponseEntity { return ResponseEntity.ok(playerService.getById(id)) } - // Afficher un joueur par nom - @GetMapping("/{name}") - fun getByName(name: String): ResponseEntity?> { + // Afficher un ou plusieurs joueur(s) par nom + @GetMapping("/name/{name}") + fun getByName(@PathVariable name: String): ResponseEntity?> { return ResponseEntity.ok(playerService.getByName(name)) } - // Afficher un joueur par prénom - @GetMapping("/{firstName}") - fun getByFirstName(firstName: String): ResponseEntity?> { + // Afficher un ou plusieurs joueur(s) par prénom + @GetMapping("/firstName/{firstName}") + fun getByFirstName(@PathVariable firstName: String): ResponseEntity?> { return ResponseEntity.ok(playerService.getByFirstName(firstName)) } + // Afficher un ou plusieurs joueur(s) par club + @GetMapping("/club/{club}") + fun getByClub(@PathVariable club: String): ResponseEntity?> { + return ResponseEntity.ok(playerService.getByClub(club)) + } + // Ajouter un joueur - @PostMapping("/add-player") - fun createPlayer(player: PlayerBean): ResponseEntity { + @PostMapping("/create-player") + fun createPlayer(@RequestBody player: PlayerBean): ResponseEntity { return ResponseEntity.ok(playerService.createPlayer(player)) } // Modifier un joueur - @PutMapping("/update-player") - fun updatePlayer(id: Long, name: String, firstName: String): ResponseEntity { - return ResponseEntity.ok(playerService.updatePlayer(id, name, firstName)) + @PutMapping("/update-player/{id}") + fun updatePlayer(@PathVariable id: Long, @RequestBody player: PlayerBean): ResponseEntity { + return ResponseEntity.ok(playerService.updatePlayer(id, player)) } // Supprimer un joueur - @DeleteMapping("/delete-player") - fun deletePlayer(id: Long): ResponseEntity { - return ResponseEntity.ok(playerService.deletePlayer(id)) + @DeleteMapping("/delete-player/{id}") + fun deletePlayer(@PathVariable id: Long): ResponseEntity { + return ResponseEntity.ok(playerService.deletePlayerById(id)) } } diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/RefereeRestController.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/RefereeRestController.kt index 01216cc..e26e90f 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/RefereeRestController.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/restControllers/RefereeRestController.kt @@ -8,9 +8,9 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -import java.util.Optional @RestController @RequestMapping("/referees") @@ -24,38 +24,44 @@ class RefereeRestController(private val refereeService: RefereeService) { // Afficher un arbitre par id @GetMapping("/{id}") - fun getById(id: Long): ResponseEntity?> { + fun getById(@PathVariable id: Long): ResponseEntity { return ResponseEntity.ok(refereeService.getById(id)) } // Afficher un ou plusieurs arbitre(s) par nom @GetMapping("/name/{name}") - fun getByName(name:String): ResponseEntity?> { + fun getByName(@PathVariable name:String): ResponseEntity?> { return ResponseEntity.ok(refereeService.getByName(name)) } - // Afficher ou plusieurs arbitre(s) par prénom - @GetMapping("/first-name/{firstName}") - fun getByFirstName(firstName:String): ResponseEntity?> { + // Afficher un ou plusieurs arbitre(s) par prénom + @GetMapping("/firstname/{firstName}") + fun getByFirstName(@PathVariable firstName:String): ResponseEntity?> { return ResponseEntity.ok(refereeService.getByFirstName(firstName)) } + // Afficher un ou plusieurs arbitre(s) par qualification + @GetMapping("/qualification/{qualification}") + fun getByQualification(@PathVariable qualification:String): ResponseEntity?> { + return ResponseEntity.ok(refereeService.getByQualification(qualification)) + } + // Ajouter un arbitre @PostMapping("/create-referee") - fun createReferee(referee: RefereeBean): ResponseEntity { + fun createReferee(@RequestBody referee: RefereeBean): ResponseEntity { return ResponseEntity.ok(refereeService.createReferee(referee)) } // Modifier un arbitre @PutMapping("/update-referee/{id}") - fun updateReferee(@PathVariable id: Long, name: String, firstName: String) : ResponseEntity { - return ResponseEntity.ok(refereeService.updateReferee(id, name, firstName)) + fun updateReferee(@PathVariable id: Long, @RequestBody referee: RefereeBean) : ResponseEntity { + return ResponseEntity.ok(refereeService.updateReferee(id, referee)) } // Supprimer un arbitre @DeleteMapping("/delete-referee/{id}") - fun deleteReferee(id:Long): ResponseEntity { - return ResponseEntity.ok(refereeService.deleteReferee(id)) + fun deleteReferee(@PathVariable id:Long): ResponseEntity { + return ResponseEntity.ok(refereeService.deleteRefereeById(id)) } } diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/MatchService.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/MatchService.kt index 0257fa7..c7102a3 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/MatchService.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/MatchService.kt @@ -1,15 +1,11 @@ package fr.teamflash.fencerjudgeback.services import fr.teamflash.fencerjudgeback.entities.MatchBean -import fr.teamflash.fencerjudgeback.entities.PlayerBean import fr.teamflash.fencerjudgeback.repositories.MatchRepository import fr.teamflash.fencerjudgeback.websocket.controllers.MatchWebSocketController -import fr.teamflash.fencerjudgeback.websocket.models.MatchUpdateMessage import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Lazy -import org.springframework.http.ResponseEntity import org.springframework.stereotype.Service -import java.util.Date @Service class MatchService( @@ -23,13 +19,19 @@ class MatchService( } // Obtenir un match par id (public) - fun getById(id:Long): MatchBean? { + fun getById(id: Long?): MatchBean? { println("MatchService.getMatchById : $id") + + if (id == null) { + println("MatchService.getMatchById : Match not found") + return null + } + return matchRepository.findById(id).get() } // Obtenir un ou plusieurs match(s) par joueurs (id) (public) - fun getByPlayers(player1ID: Long, player2ID: Long): List { + fun getByPlayers(player1ID: Long?, player2ID: Long?): List { println("MatchService.getMatchByPlayers : $player1ID - $player2ID") return matchRepository.findAll().filter { it.player1ID == player1ID && it.player2ID == player2ID } } @@ -44,61 +46,41 @@ class MatchService( } // Modifier un match (admin) - fun updateMatch(id: Long, date: Date, refereeID: Long, player1ID: Long, player2ID: Long, scorePlayer1:Int, scorePlayer2:Int) : Int { - println("MatchService.updateMatch : $id - $refereeID - $player1ID - $player2ID - $scorePlayer1 - $scorePlayer2") + fun updateMatch(id: Long?, newMatch: MatchBean): Int { + println("MatchService.updateMatch : $newMatch") if (getById(id) == null) { - println("MatchService.updateMatch : Match not found") return -1 } - // Broadcast the update via WebSocket -// matchWebSocketController?.broadcastMatchUpdate(savedMatch, MatchUpdateMessage.UpdateType.SCORE_UPDATE) - - // Créer nouveau MatchBean à l'id renseigné - val newMatch = MatchBean( - id = id, - date = date, - refereeID = refereeID, - player1ID = player1ID, - player2ID = player2ID, - score1 = scorePlayer1, - score2 = scorePlayer2 - ) - -// if ( -// // Supprimer le MatchBean à l'id en paramètre -// deleteMatch(id) == 1 -// && createMatch(newMatch) == 1) { -// -// // Insérer le nouveau MatchBean à l'id en paramètre -// -// -// return 1 -// } - - // Supprimer le MatchBean à l'id en paramètre - if (deleteMatch(id) == 1) { - // Insérer le nouveau MatchBean à l'id en paramètre - createMatch(newMatch) - } - + val updatedMatch = newMatch.copy(id = id) + matchRepository.save(updatedMatch) return 1 } // Supprimer un match (admin) - fun deleteMatch(id:Long) : Int { - println("MatchService.deleteMatch : $id") + fun deleteMatchById(id: Long?) : Int? { + println("MatchService.deleteMatchById : $id") - try { - matchRepository.deleteById(id) - } catch (e: Exception) { - println("Error deleting match: ${e.message}") + if (getById(id) == null) { + println("MatchService.deleteMatchById : Match not found") return -1 } - - // Broadcast the match cancellation via WebSocket before deleting -// matchWebSocketController?.broadcastMatchUpdate(matchID, MatchUpdateMessage.UpdateType.MATCH_CANCEL) + matchRepository.deleteById(id!!) return 1 } + + fun getMatchesByCity(city: String): List? { + println("MatchService.getMatchesByCity : $city") + + return matchRepository.findAll() + .filter { it.city == city } + } + + fun getMatchesByCountry(country: String): List? { + println("MatchService.getMatchesByCountry : $country") + + return matchRepository.findAll() + .filter { it.country == country } + } } diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/PlayerService.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/PlayerService.kt index 2d5858a..9be9a80 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/PlayerService.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/PlayerService.kt @@ -4,70 +4,74 @@ import fr.teamflash.fencerjudgeback.entities.PlayerBean import fr.teamflash.fencerjudgeback.repositories.PlayerRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service -import java.util.Optional @Service class PlayerService(@Autowired private val playerRepository: PlayerRepository) { // Obtenir tous les joueurs (public) fun getAll(): List { - println("RefereeService.getReferees") + println("PlayerService.getAll") return playerRepository.findAll() } // Obtenir un joueur par id (public) - fun getById(id:Long) : Optional { - println("RefereeService.getRefereeById : $id") - return playerRepository.findById(id) + fun getById(id:Long?) : PlayerBean? { + println("PlayerService.getById : $id") + + if (id == null) { + return null + } + + return playerRepository.findById(id).get() } // Obtenir un ou plusieurs joueur(s) par nom (public) fun getByName(name:String): List? { - println("RefereeService.getRefereeByName : $name") + println("PlayerService.getByName : $name") return playerRepository.findAll().filter{ it.name == name } } // Obtenir un ou plusieurs joueur(s) par prénom fun getByFirstName(firstName:String): List? { - println("RefereeService.getRefereeByFirstName : $firstName") + println("PlayerService.getByFirstName : $firstName") return playerRepository.findAll().filter{ it.firstName == firstName } } + // Obtenir un ou plusieurs joueur(s) par club + fun getByClub(club:String): List? { + println("PlayerService.getByClub : $club") + return playerRepository.findAll().filter{ it.club == club } + } + // Ajouter un joueur (admin) fun createPlayer(referee: PlayerBean) : PlayerBean { - println("RefereeService.createReferee : $referee") + println("PlayerService.createPlayer : $referee") return playerRepository.save(referee) } // Modifier un joueur (admin) - fun updatePlayer(id:Long, name:String, firstName: String) : Int { + fun updatePlayer(id:Long, newPlayer: PlayerBean) : Int { // Vérifier si le joueur existe à l'id renseigné if (getById(id) == null) { - println("RefereeService.updateReferee : Referee not found") + println("PlayerService.updatePlayer : Player not found") return -1 } - // Créer nouveau PlayerBean à l'id renseigné - val newPlayer = PlayerBean(id, name, firstName) - - // Supprimer le PlayerBean à l'id en paramètre - deletePlayer(id) - - // Insérer le nouveau PlayerBean - createPlayer(newPlayer) + val updatedPlayer = newPlayer.copy(id = id) + playerRepository.save(updatedPlayer) return 1 } // Supprimer un joueur (admin) - fun deletePlayer(id:Long): Int { - println("RefereeService.deleteReferee : $id") + fun deletePlayerById(id:Long?): Int { + println("PlayerService.deletePlayer : $id") if (getById(id) == null) { - println("RefereeService.deleteReferee : Referee not found") + println("PlayerService.deletePlayer : Player not found") return -1 } - playerRepository.deleteById(id) + playerRepository.deleteById(id!!) return 1 } } \ No newline at end of file diff --git a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/RefereeService.kt b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/RefereeService.kt index 8d169ad..2fbbee2 100644 --- a/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/RefereeService.kt +++ b/FencerJudgeBack/src/main/kotlin/fr/teamflash/fencerjudgeback/services/RefereeService.kt @@ -3,9 +3,7 @@ package fr.teamflash.fencerjudgeback.services import fr.teamflash.fencerjudgeback.entities.RefereeBean import fr.teamflash.fencerjudgeback.repositories.RefereeRepository import org.springframework.beans.factory.annotation.Autowired -import org.springframework.data.jpa.domain.AbstractPersistable_.id import org.springframework.stereotype.Service -import java.util.Optional @Service class RefereeService(@Autowired private val refereeRepository: RefereeRepository) { @@ -16,9 +14,14 @@ class RefereeService(@Autowired private val refereeRepository: RefereeRepository } // Obtenir un arbitre par id (public) - fun getById(id:Long) : Optional { + fun getById(id:Long?) : RefereeBean? { println("RefereeService.getRefereeById : $id") - return refereeRepository.findById(id) + + if (id == null) { + return null + } + + return refereeRepository.findById(id).get() } // Obtenir un ou plusieurs arbitre(s) par nom (public) @@ -33,6 +36,12 @@ class RefereeService(@Autowired private val refereeRepository: RefereeRepository return refereeRepository.findAll().filter{ it.firstName == firstName } } + // Obtenir un ou plusieurs arbitre(s) par qualification + fun getByQualification(qualification:String): List? { + println("RefereeService.getRefereeByQualification : $qualification") + return refereeRepository.findAll().filter{ it.qualification == qualification } + } + // Ajouter un arbitre (admin) fun createReferee(referee: RefereeBean) : RefereeBean { println("RefereeService.createReferee : $referee") @@ -40,27 +49,19 @@ class RefereeService(@Autowired private val refereeRepository: RefereeRepository } // Modifier un arbitre (admin) - fun updateReferee(id:Long, name:String, firstName: String) : Int { + fun updateReferee(id:Long, newReferee: RefereeBean) : Int? { // Vérifier si l'arbitre existe à l'id renseigné if (getById(id) == null) { - println("RefereeService.updateReferee : Referee not found") return -1 } - // Créer nouveau RefereeBean à l'id renseigné - val newReferee = RefereeBean(id, name, firstName) - - // Supprimer le RefereeBean à l'id en paramètre - deleteReferee(id) - - // Insérer le nouveau RefereeBean à l'id en paramètre - createReferee(newReferee) - + val updatedMatch = newReferee.copy(id = id) + refereeRepository.save(updatedMatch) return 1 } // Supprimer un arbitre (admin) - fun deleteReferee(id:Long): Int { + fun deleteRefereeById(id:Long): Int { println("RefereeService.deleteReferee : $id") if (getById(id) == null) { diff --git a/FencerJudgeBack/src/main/resources/application.properties b/FencerJudgeBack/src/main/resources/application.properties index 6ada312..0084aa4 100644 --- a/FencerJudgeBack/src/main/resources/application.properties +++ b/FencerJudgeBack/src/main/resources/application.properties @@ -1 +1,16 @@ spring.application.name=FencerJudgeBack + +# H2 Database Configuration +spring.datasource.url=jdbc:h2:file:./db;AUTO_SERVER=true +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + +# Enable H2 Console +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console + +# Hibernate Configuration +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true \ No newline at end of file diff --git a/FencerJudgeBack/test.http b/FencerJudgeBack/test.http new file mode 100644 index 0000000..6a6444e --- /dev/null +++ b/FencerJudgeBack/test.http @@ -0,0 +1,138 @@ +### Get all matches +GET http://localhost:8080/matches/ + +### Get matches by players --> TODO +GET http://localhost:8080/matches/players/1/2 + +### Get matches by date +GET http://localhost:8080/matches/date/2025-06-02 + +### Get matches by country +GET http://localhost:8080/matches/country/France + +### Get matches by city +GET http://localhost:8080/matches/city/Paris + +### Get active matches +GET http://localhost:8080/matches/active + +### Get finished matches +GET http://localhost:8080/matches/over + +### Get not started matches +GET http://localhost:8080/matches/not-started + +### Get match by ID +GET http://localhost:8080/matches/2 + +### Create new match +POST http://localhost:8080/matches/create-match +Content-Type: application/json + +{ + "weapon": "Épée", + "country": "France", + "city": "Paris", + "player1ID": 1, + "player2ID": 2, + "refereeID": 1, + "score1": 0, + "score2": 0, + "date": "2025-06-02", + "state": "NOT STARTED" +} + +### Update match +PUT http://localhost:8080/matches/update-match/4 +Content-Type: application/json + +{ + + "weapon": "Épée", + "country": "France", + "city": "Paris", + "player1ID": 1, + "player2ID": 2, + "refereeID": 1, + "score1": 5, + "score2": 3, + "date": "2025-06-02", + "state": "OVER" +} + +### Delete match +DELETE http://localhost:8080/matches/delete-match/3 + +### Get all referees +GET http://localhost:8080/referees/ + +### Get referee by ID +GET http://localhost:8080/referees/1 + +### Get referees by name +GET http://localhost:8080/referees/name/Smith + +### Get referees by firstname +GET http://localhost:8080/referees/firstname/John + +### Get referees by qualification +GET http://localhost:8080/referees/qualification/NATIONAL + +### Create new referee +POST http://localhost:8080/referees/create-referee +Content-Type: application/json + +{ + "name": "Smith", + "firstName": "John", + "qualification": "NATIONAL" +} + +### Update referee +PUT http://localhost:8080/referees/update-referee/6 +Content-Type: application/json + +{ + "name": "Smith", + "firstName": "John", + "qualification": "INTERNATIONAL" +} + +### Delete referee +DELETE http://localhost:8080/referees/delete-referee/5 + +### Get all players +GET http://localhost:8080/players/ + +### Get player by ID +GET http://localhost:8080/players/10 + +### Get players by name +GET http://localhost:8080/players/name/Doe + +### Get players by firstname +GET http://localhost:8080/players/firstname/Jane + +### Create new player +POST http://localhost:8080/players/create-player +Content-Type: application/json + +{ + "name": "Doe", + "firstName": "Jane", + "club": "Paris Escrime Club" +} + +### Update player +PUT http://localhost:8080/players/update-player/10 +Content-Type: application/json + +{ + "name": "Doe", + "firstName": "Jane", + "club": "Un autre club" +} + +### Delete player +DELETE http://localhost:8080/players/delete-player/10 +