From 22352c7de1fb804bfa4bdb59cfe00d3d21698b7c Mon Sep 17 00:00:00 2001 From: Noan07 <84435602+Noan07@users.noreply.github.com> Date: Sun, 26 Feb 2023 17:18:22 +0100 Subject: [PATCH] =?UTF-8?q?:hammer:=20Am=C3=A9lioration=20des=20controleur?= =?UTF-8?q?=20+=20mise=20en=20place=20de=20logger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApiLeapHit/Controllers/ChatController.cs | 188 +++++++++++++--- .../ApiLeapHit/Controllers/GameController.cs | 144 ++++++------ .../Controllers/MessageController.cs | 103 +++++---- .../Controllers/PlayerController.cs | 207 ++++++++++++++---- code/server/ApiLeapHit/Mapper/ChatMapper.cs | 29 +++ .../server/ApiLeapHit/Mapper/MessageMapper.cs | 21 ++ code/server/ApiLeapHit/Mapper/PlayerMapper.cs | 11 + code/server/DTO/Factory/ApiLink.cs | 22 ++ code/server/DTO/Factory/ApiResponse.cs | 2 + .../DataManager/DbDataManager.Chat.cs | 25 +++ .../DataManager/DbDataManager.Player.cs | 9 + code/server/DataBase/PongDB.db | Bin 57344 -> 57344 bytes 12 files changed, 570 insertions(+), 191 deletions(-) create mode 100644 code/server/ApiLeapHit/Mapper/ChatMapper.cs create mode 100644 code/server/ApiLeapHit/Mapper/MessageMapper.cs create mode 100644 code/server/DTO/Factory/ApiLink.cs diff --git a/code/server/ApiLeapHit/Controllers/ChatController.cs b/code/server/ApiLeapHit/Controllers/ChatController.cs index d04390f..8ed49ba 100644 --- a/code/server/ApiLeapHit/Controllers/ChatController.cs +++ b/code/server/ApiLeapHit/Controllers/ChatController.cs @@ -1,6 +1,8 @@ -using DataBase.DataManager; +using ApiLeapHit.Mapper; +using DataBase.DataManager; using DataBase.Entity; using DTO; +using DTO.Factory; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -12,67 +14,195 @@ namespace ApiLeapHit.Controllers { private readonly DbDataManager _dataManager; + private readonly ILogger _logger; - - public ChatController(DbDataManager dataManager) + public ChatController(DbDataManager dataManager, ILogger logger) { _dataManager = dataManager; + _logger = logger; } [HttpPost] public async Task AddChat([FromBody] DTOChat dtoChat) { - var player1 = await _dataManager.GetPlayer(dtoChat.PlayerId2.playerId); - var player2 = await _dataManager.GetPlayer(dtoChat.PlayerId2.playerId); - - var chat = new Chat + try { - chatId = dtoChat.chatId, - player1 = player1.playerId, - player2 = player2.playerId - }; + var player1 = await _dataManager.GetPlayer(dtoChat.PlayerId1.playerId); + var player2 = await _dataManager.GetPlayer(dtoChat.PlayerId2.playerId); + + await _dataManager.AddChat(dtoChat.ToChat(player1, player2)); - await _dataManager.AddChat(chat); - return Ok(); + var success_message = $"Le chat entre {player1.name} et {player2.name} a été ajouté avec succès."; + _logger.LogInformation(success_message); + return Ok(new ApiResponse(success_message)); + } + catch (Exception ex) + { + var error_message = $"Une erreur est survenue lors de l'ajout du chat : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); + } } [HttpGet] public async Task>> GetChats() { - var chats = await _dataManager.GetChats(); - if (chats == null) + try + { + var chats = await _dataManager.GetChats(); + if (chats == null) + { + var message = "Aucun chat n'a été trouvé."; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); + } + + var dtoChats = new List(); + foreach (var chat in chats) + { + var player1 = await _dataManager.GetPlayer(chat.player1); + var player2 = await _dataManager.GetPlayer(chat.player2); + + var dtoChat = chat.ToDto(player1, player2); + + dtoChats.Add(dtoChat); + } + + var success_message = $"La récupération des chats a réussi. Nombre de chats : {dtoChats.Count}"; + _logger.LogInformation(success_message); + return Ok(new ApiResponse>(success_message,dtoChats)); + } + catch (Exception ex) { - return NotFound(); + var error_message = $"Une erreur est survenue lors de la récupération des chats : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); } + } - var dtoChats = new List(); - foreach (var chat in chats) + [HttpGet("{id}")] + public async Task>> GetChatById(int id) + { + try { + var chat = await _dataManager.GetChat(id); + if (chat == null) + { + var message = "Aucun chat n'a été trouvé."; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); + } + var player1 = await _dataManager.GetPlayer(chat.player1); var player2 = await _dataManager.GetPlayer(chat.player2); - var dtoChat = new DTOChat + var dtoChat = chat.ToDto(player1, player2); + + var success_message = $"La récupération du chat a réussi pour le chat {id}."; + _logger.LogInformation(success_message); + return Ok(new ApiResponse(success_message, dtoChat)); + } + catch (Exception ex) + { + var error_message = $"Une erreur est survenue lors de la récupération du chat {id} : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); + } + } + + [HttpGet("byPlayer/{id}")] + public async Task>> GetChatsByIdPlayer(int id) + { + try + { + var chats = await _dataManager.GetChatsByIdPlayer(id); + if (chats == null || chats.Count() == 0) + { + var message = "Aucun chat n'a été trouvé pour l'id : {id}."; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); + } + + var dtoChats = new List(); + foreach (var chat in chats) { - chatId = chat.chatId, - PlayerId1 = new DTOPlayer { playerId = player1.playerId, name = player1.name }, - PlayerId2 = new DTOPlayer { playerId = player2.playerId, name = player2.name } - }; + var player1 = await _dataManager.GetPlayer(chat.player1); + var player2 = await _dataManager.GetPlayer(chat.player2); + + var dtoChat = chat.ToDto(player1, player2); + + dtoChats.Add(dtoChat); + } - dtoChats.Add(dtoChat); + var success_message = $"La récupération des chats a réussi pour l'id : {id}. Nombre de chats : {dtoChats.Count}"; + _logger.LogInformation(success_message); + return Ok(new ApiResponse>(success_message, dtoChats)); } + catch (Exception ex) + { + var error_message = $"Une erreur est survenue lors de la récupération des chats de l'utilisateur {id} : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); + } + } - return Ok(dtoChats); + [HttpGet("players/{idPlayer1}/{idPlayer2}")] + public async Task>> GetChatsByIdPlayers(int idPlayer1, int idPlayer2) + { + try + { + var chats = await _dataManager.GetChatsByIdPlayers(idPlayer1,idPlayer2); + if (chats == null ||chats.Count() == 0) + { + var message = $"Aucun chat n'a été trouvé pour les joueurs {idPlayer1} et {idPlayer2}."; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); + } + + var dtoChats = new List(); + foreach (var chat in chats) + { + var player1 = await _dataManager.GetPlayer(chat.player1); + var player2 = await _dataManager.GetPlayer(chat.player2); + + dtoChats.Add(chat.ToDto(player1, player2)); + } + + var success_message = $"La récupération des chats a réussi pour les joueurs {idPlayer1} et {idPlayer2}. Nombre de chats : {dtoChats.Count}"; + _logger.LogInformation(success_message); + return Ok(new ApiResponse>(success_message, dtoChats)); + } + catch (Exception ex) + { + var error_message = $"Une erreur est survenue lors de la récupération des chats pour les joueurs {idPlayer1} et {idPlayer2} : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); + } } [HttpDelete("{id}")] public async Task RemoveChat(int id) { - var result = await _dataManager.RemoveChat(id); - if (result) + try + { + var result = await _dataManager.RemoveChat(id); + if (result) + { + var success_message = $"Le chat avec l'identifiant {id} a été supprimé avec succès."; + _logger.LogInformation(success_message); + return Ok(new ApiResponse(success_message)); + } + + var warning_message = $"Le chat avec l'identifiant {id} n'a pas été trouvé."; + _logger.LogWarning(warning_message); + return NotFound(new ApiResponse(warning_message)); + } + catch (Exception ex) { - return Ok(result); + var error_message = $"Une erreur est survenue lors de la suppression du chat : {ex.Message}"; + _logger.LogError(ex, error_message); + return StatusCode(500, new ApiResponse(error_message)); } - return NotFound(result); } } } diff --git a/code/server/ApiLeapHit/Controllers/GameController.cs b/code/server/ApiLeapHit/Controllers/GameController.cs index ca580b8..306d809 100644 --- a/code/server/ApiLeapHit/Controllers/GameController.cs +++ b/code/server/ApiLeapHit/Controllers/GameController.cs @@ -30,28 +30,27 @@ namespace ApiLeapHit.Controllers { try { + _logger.LogInformation("Récupération de la game avec l'identifiant {id}", id); + var game = await _dataManager.GetGame(id); if (game == null) { - return NotFound(new ApiResponse("La game avec l'identifiant " + id + " n'existe pas.")); + var message = $"La game avec l'identifiant {id} n'existe pas"; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); } - var winner = await _dataManager.GetPlayer(game.winner); - //if (winner == null) - //{ - // return NotFound("Le joueur avec l'identifiant " + game.winner + " n'existe pas."); - //} + var winner = await _dataManager.GetPlayer(game.winner); var loser = await _dataManager.GetPlayer(game.loser); - //if (loser == null) - //{ - // return NotFound("Le joueur avec l'identifiant " + game.loser + " n'existe pas."); - //} + + _logger.LogInformation("Récupération des joueurs pour la game avec l'identifiant {id}", id); return Ok(new ApiResponse("Récupération de la game réussie.", game.ToDto(winner, loser))); } catch (Exception ex) { - return StatusCode(500, new ApiResponse("Une erreur est survenue lors de la récupération des données : " + ex.Message)); + _logger.LogError(ex, $"Une erreur est survenue lors de la récupération des données pour la game avec l'identifiant {id}"); + return StatusCode(500, new ApiResponse($"Une erreur est survenue lors de la récupération des données : {ex.Message}")); } } @@ -60,137 +59,132 @@ namespace ApiLeapHit.Controllers { try { + _logger.LogInformation("Récupération de toutes les games."); + var games = await _dataManager.GetGames(); if (games == null) { - return NotFound(new ApiResponse>("Aucune game n'ont été trouvées.")); + var message = "Aucune game n'a été trouvée."; + _logger.LogWarning(message); + return NotFound(new ApiResponse(message)); } - //StringBuilder errorMessage = new StringBuilder(); var dtoGames = new List(); + foreach (var game in games) { var winner = await _dataManager.GetPlayer(game.winner); var loser = await _dataManager.GetPlayer(game.loser); - //if (winner == null || loser == null) - //{ - // errorMessage.Append("Le joueur gagnant ou le joueur perdant n'existe pas pour le jeu avec l'identifiant "); - // errorMessage.Append(game.gameId); - // errorMessage.Append("."); - // break; - //} + //ce cas n'est jamais censé arrivé + if (winner == null || loser == null) + { + _logger.LogError($"Le joueur gagnant ou le joueur perdant n'existe pas pour le jeu avec l'identifiant {game.gameId}."); + continue; + } + dtoGames.Add(game.ToDto(winner, loser)); } - //if (errorMessage.Length > 0) - //{ - // return NotFound(errorMessage.ToString()); - //} - return Ok(new ApiResponse>("La récupération des games à réussit." , dtoGames)); + _logger.LogInformation("{Count} games ont été récupérées.", dtoGames.Count); + return Ok(new ApiResponse>("La récupération des games a réussi.", dtoGames)); } catch (Exception ex) { - return StatusCode(500, new ApiResponse("Une erreur est survenue lors de la récupération des données : " + ex.Message)); + var message = "Une erreur est survenue lors de la récupération des données."; + _logger.LogError(ex, message); + return StatusCode(500, new ApiResponse($"{message} {ex.Message}")); } } [HttpGet("byPlayer/{id}")] public async Task>> GetGameByIdPlayer(int id) { - try { + try + { var games = await _dataManager.GetGameById(id); + if (games == null || games.Count == 0) { - return NotFound(new ApiResponse>("Aucune game trouvé pour le joueur avec l'id : " + id)); + var message = $"Aucune game trouvée pour le joueur avec l'id {id}."; + _logger.LogInformation(message); + return NotFound(new ApiResponse(message)); } - //StringBuilder errorMessage = new StringBuilder(); + var dtoGames = new List(); + foreach (var game in games) { var winner = await _dataManager.GetPlayer(game.winner); var loser = await _dataManager.GetPlayer(game.loser); - - //if (winner == null) - //{ - // errorMessage.Append("Le joueur gagnant n'existe pas pour le jeu avec l'identifiant "); - // errorMessage.Append(game.gameId); - // errorMessage.Append("."); - // break; - //} - - //if (loser == null) - //{ - // errorMessage.Append("Le joueur perdant n'existe pas pour le jeu avec l'identifiant "); - // errorMessage.Append(game.gameId); - // errorMessage.Append("."); - // break; - //} - dtoGames.Add(game.ToDto(winner, loser)); } - //if (errorMessage.Length > 0) - //{ - // return NotFound(errorMessage.ToString()); - //} - return Ok(new ApiResponse>("Récupérations réussis des games pour le joueur " + id, dtoGames)); + var successMessage = $"Récupération réussie des games pour le joueur avec l'id {id}."; + _logger.LogInformation(successMessage); + return Ok(new ApiResponse>(successMessage, dtoGames)); } catch (Exception ex) { - return StatusCode(500, new ApiResponse("Une erreur est survenue lors de la récupération des données : " + ex.Message)); + var errorMessage = $"Une erreur est survenue lors de la récupération des games pour le joueur avec l'id {id}."; + _logger.LogError(errorMessage + " Error message: " + ex.Message); + return StatusCode(500, new ApiResponse(errorMessage)); } } [HttpPost] public async Task AddGame([FromBody] DTOGameWithIdPlayer dtoGame) { - try { + try + { var winner = await _dataManager.GetPlayer(dtoGame.playerWinner); var loser = await _dataManager.GetPlayer(dtoGame.playerLoser); - //StringBuilder errorMessage = new StringBuilder(); - - //if (winner == null) - //{ - // errorMessage.Append("Le joueur gagnant avec l'identifiant "); - // errorMessage.Append(dtoGame.playerWinner.playerId); - // errorMessage.Append(" n'existe pas."); - // return NotFound(errorMessage.ToString()); - //} - - //if (loser == null) + //if (winner == null || loser == null) //{ - // errorMessage.Append("Le joueur perdant avec l'identifiant "); - // errorMessage.Append(dtoGame.playerLoser.playerId); - // errorMessage.Append(" n'existe pas."); - // return NotFound(errorMessage.ToString()); + // var errorMessage = "Le joueur gagnant ou le joueur perdant n'existe pas pour la partie avec l'identifiant " + dtoGame.gameId + "."; + // _logger.LogError(errorMessage); + // return NotFound(new ApiResponse(errorMessage)); //} var game = dtoGame.ToGame(winner, loser); - return Ok(new ApiResponse("La game a été ajoutée avec succès.", game)); + await _dataManager.AddGame(game); + + var successMessage = "La partie avec l'identifiant " + game.gameId + " a été ajoutée avec succès."; + _logger.LogInformation(successMessage); + return Ok(new ApiResponse(successMessage, game)); } catch (Exception ex) { - return StatusCode(500, new ApiResponse("Une erreur est survenue lors de la récupération des données : " + ex.Message)); + var errorMessage = "Une erreur est survenue lors de l'ajout de la partie : " + ex.Message; + _logger.LogError(errorMessage); + return StatusCode(500, new ApiResponse(errorMessage)); } } - [HttpDelete("{id}")] + [HttpDelete("{id}")] public async Task RemoveGame(int id) { - try { + try + { var result = await _dataManager.RemoveGame(id); if (result) { - return Ok(new ApiResponse( "La game avec l'identifiant " + id + " a été supprimée avec succès.")); + var successMessage = $"La game avec l'identifiant {id} a été supprimée avec succès."; + _logger.LogInformation(successMessage); + return Ok(new ApiResponse(successMessage)); } - return NotFound(new ApiResponse("La game avec l'identifiant " + id + " n'existe pas.")); + + var notFoundMessage = $"La game avec l'identifiant {id} n'existe pas."; + _logger.LogInformation(notFoundMessage); + return NotFound(new ApiResponse(notFoundMessage)); } catch (Exception ex) { - return StatusCode(500, new ApiResponse("Une erreur est survenue lors de la récupération des données : " + ex.Message)); + var errorMessage = $"Une erreur est survenue lors de la suppression de la game avec l'identifiant {id} : {ex.Message}"; + _logger.LogError(errorMessage); + return StatusCode(500, new ApiResponse(errorMessage)); } } } diff --git a/code/server/ApiLeapHit/Controllers/MessageController.cs b/code/server/ApiLeapHit/Controllers/MessageController.cs index 218b3f6..abf4e31 100644 --- a/code/server/ApiLeapHit/Controllers/MessageController.cs +++ b/code/server/ApiLeapHit/Controllers/MessageController.cs @@ -1,6 +1,7 @@ using DataBase.DataManager; using DataBase.Entity; using DTO; +using DTO.Factory; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -10,68 +11,88 @@ namespace ApiLeapHit.Controllers [ApiController] public class MessageController : Controller { - private readonly DbDataManager _dataManager; + private readonly DbDataManager _dataManager; + private readonly ILogger _logger; - public MessageController(DbDataManager dataManager) + public MessageController(DbDataManager dataManager, ILogger logger) { _dataManager = dataManager; + _logger = logger; } - [HttpGet("{id}")] - public async Task> ReceiveMessage(int id) + [HttpPost] + public async Task SendMessage([FromBody] DTOMessage dtoMessage) { - var message = await _dataManager.ReceiveMessage(id); - if (message == null) + try { - return NotFound(); - } + var player = await _dataManager.GetPlayer(dtoMessage.PlayerId.playerId); + if (player == null) + { + _logger.LogWarning($"Le joueur avec l'identifiant {dtoMessage.PlayerId.playerId} n'existe pas."); + return NotFound(new ApiResponse($"Le joueur avec l'identifiant {dtoMessage.PlayerId.playerId} n'existe pas.")); + } - var player = await _dataManager.GetPlayer(message.player); + var message = new Message + { + messageId = dtoMessage.messageId, + message = dtoMessage.message, + timestamp = dtoMessage.timestamp, + player = player.playerId + }; + await _dataManager.SendMessage(message); - var dtoMessage = new DTOMessage + _logger.LogInformation($"Le message avec l'identifiant {message.messageId} a été envoyé avec succès."); + return Ok(new ApiResponse($"Le message avec l'identifiant {message.messageId} a été envoyé avec succès.")); + } + catch (Exception ex) { - messageId = message.messageId, - message = message.message, - timestamp = message.timestamp, - PlayerId = new DTOPlayer - { - playerId = player.playerId, - name = player.name, - nbBallTouchTotal = player.nbBallTouchTotal, - timePlayed = player.timePlayed - } - }; - return Ok(dtoMessage); + _logger.LogError($"Une erreur est survenue lors de l'envoi du message : {ex.Message}"); + return StatusCode(500, new ApiResponse($"Une erreur est survenue lors de l'envoi du message : {ex.Message}")); + } } - [HttpPost] - public async Task SendMessage([FromBody] DTOMessage dtoMessage) + [HttpDelete("{id}")] + public async Task RemoveMessage(int id) { - var player = await _dataManager.GetPlayer(dtoMessage.PlayerId.playerId); - - var message = new Message + try { - messageId = dtoMessage.messageId, - message = dtoMessage.message, - timestamp = dtoMessage.timestamp, - player = player.playerId - }; - - await _dataManager.SendMessage(message); - return Ok(); + var result = await _dataManager.RemoveMessage(id); + if (result) + { + _logger.LogInformation($"Le message avec l'identifiant {id} a été supprimé avec succès."); + return Ok(new ApiResponse($"Le message avec l'identifiant {id} a été supprimé avec succès.")); + } + else + { + _logger.LogWarning($"Le message avec l'identifiant {id} n'existe pas."); + return NotFound(new ApiResponse($"Le message avec l'identifiant {id} n'existe pas.")); + } + } + catch (Exception ex) + { + _logger.LogError($"Une erreur est survenue lors de la suppression du message avec l'identifiant {id} : {ex.Message}"); + return StatusCode(500, new ApiResponse($"Une erreur est survenue lors de la suppression du message avec l'identifiant {id} : {ex.Message}")); + } } - [HttpDelete("{id}")] - public async Task RemoveMessage(int id) + [HttpGet("{id}")] + public async Task> ReceiveMessage(int id) { - var result = await _dataManager.RemoveMessage(id); - if (result) + var message = await _dataManager.ReceiveMessage(id); + if (message == null) { - return Ok(result); + return NotFound(); } - return NotFound(result); + + var player = await _dataManager.GetPlayer(message.player); + var chat = await _dataManager.GetChat(message.chat); + + + + return Ok(message); } + } } diff --git a/code/server/ApiLeapHit/Controllers/PlayerController.cs b/code/server/ApiLeapHit/Controllers/PlayerController.cs index 8b46504..346902b 100644 --- a/code/server/ApiLeapHit/Controllers/PlayerController.cs +++ b/code/server/ApiLeapHit/Controllers/PlayerController.cs @@ -1,6 +1,8 @@ -using DataBase.DataManager; +using ApiLeapHit.Mapper; +using DataBase.DataManager; using DataBase.Entity; using DTO; +using DTO.Factory; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Net; @@ -12,46 +14,132 @@ namespace ApiLeapHit.Controllers public class PlayerController : ControllerBase { private readonly DbDataManager _dataManager; + private readonly ILogger _logger; - public PlayerController(DbDataManager dataManager) + public PlayerController(DbDataManager dataManager, ILogger logger) { _dataManager = dataManager; + _logger = logger; } + [HttpGet("{id}")] public async Task> GetPlayer(int id) { - var player = await _dataManager.GetPlayer(id); - if (player == null) + try { - return NotFound(); - } + var player = await _dataManager.GetPlayer(id); + if (player == null) + { + return NotFound(new ApiResponse("Joueur non trouvé.")); + } + + var response = new ApiResponse($"Le joueur avec l'id {id} a été récupéré avec succès.", player.ToDto()); + // Ajout des liens HATEOAS + response.Links.Add(new ApiLink( + Url.Action("GetPlayer", "Player", new { id }), + "self", + "GET" + )); + response.Links.Add(new ApiLink( + Url.Action("RemovePlayer", "Player", new { id }), + "delete", + "DELETE" + )); + response.Links.Add(new ApiLink( + Url.Action("Put", "Player", new { id }), + "update", + "PUT" + )); - var dtoPlayer = new DTOPlayer + return Ok(response); + } + catch (Exception ex) { - playerId = player.playerId, - name = player.name, - nbBallTouchTotal = player.nbBallTouchTotal, - timePlayed = player.timePlayed, - - }; - return Ok(dtoPlayer); + _logger.LogError(ex, $"Une erreur est survenue lors de la récupération du joueur avec l'id {id}."); + return StatusCode((int)HttpStatusCode.InternalServerError, new ApiResponse("Une erreur est survenue lors de la récupération du joueur.")); + } } [HttpPost] public async Task AddPlayer([FromBody] DTOPlayer dtoPlayer) { - - var player = new Player + try + { + var player = dtoPlayer.ToPlayer(); + + await _dataManager.AddPlayer(player); + + // Ajout des liens HATEOAS + var response = new ApiResponse("Joueur ajouté avec succès."); + response.Links.Add(new ApiLink( + Url.Action("GetPlayer", "Player", new { id = player.playerId }), + "self", + "GET" + )); + + return Ok(response); + } + catch (Exception ex) + { + _logger.LogError(ex, "Une erreur est survenue lors de l'ajout du joueur."); + return StatusCode((int)HttpStatusCode.InternalServerError, new ApiResponse("Une erreur est survenue lors de l'ajout du joueur.")); + } + } + + [HttpGet] + public async Task>> GetPlayers() + { + try + { + var players = await _dataManager.GetPlayers(); + if (players == null || players.Count() == 0) + { + return NotFound(new ApiResponse>("Aucun joueur trouvé.")); + } + + var dtoPlayers = players.Select(p => p.ToDto()).ToList(); + + var response = new ApiResponse>($"La récupération des players a réussi. Nombre de players : {dtoPlayers.Count}", dtoPlayers); + + // Ajout des liens HATEOAS + response.Links.Add(new ApiLink( + Url.Action("GetPlayers", "Player"), + "self", + "GET" + )); + response.Links.Add(new ApiLink( + Url.Action("AddPlayer", "Player"), + "create", + "POST" + )); + + foreach (var player in dtoPlayers) + { + response.Links.Add(new ApiLink( + Url.Action("GetPlayer", "Player", new { id = player.playerId }), + "get_player", + "GET" + )); + response.Links.Add(new ApiLink( + Url.Action("RemovePlayer", "Player", new { id = player.playerId }), + "delete_player", + "DELETE" + )); + response.Links.Add(new ApiLink( + Url.Action("Put", "Player", new { id = player.playerId }), + "update_player", + "PUT" + )); + } + + return Ok(response); + } + catch (Exception ex) { - playerId = dtoPlayer.playerId, - name = dtoPlayer.name, - nbBallTouchTotal = dtoPlayer.nbBallTouchTotal, - timePlayed = dtoPlayer.timePlayed, - }; - - await _dataManager.AddPlayer(player); - return Ok(); + _logger.LogError(ex, "Une erreur est survenue lors de la récupération des joueurs."); + return StatusCode((int)HttpStatusCode.InternalServerError, new ApiResponse("Une erreur est survenue lors de la récupération des joueurs.")); + } } [HttpDelete("{id}")] @@ -62,39 +150,66 @@ namespace ApiLeapHit.Controllers var result = await _dataManager.RemovePlayer(id); if (result) { - return Ok(); + // Ajout des liens HATEOAS + var response = new ApiResponse("Joueur supprimé avec succès."); + response.Links.Add(new ApiLink( + Url.Action("GetPlayers", "Player"), + "self", + "GET" + )); + + return Ok(response); } - return NotFound(); + return NotFound(new ApiResponse("Joueur non trouvé.")); } catch (Exception ex) { - return StatusCode((int)HttpStatusCode.InternalServerError); + _logger.LogError(ex, $"Une erreur est survenue lors de la suppression du joueur avec l'id {id}."); + return StatusCode((int)HttpStatusCode.InternalServerError, new ApiResponse("Une erreur est survenue lors de la suppression du joueur.")); } } - - [HttpPut("{id}")] public async Task Put(int id, [FromBody] DTOPlayer dtoPlayer) - { - if (!ModelState.IsValid) - return StatusCode((int)HttpStatusCode.BadRequest); //"Les données du player ne sont pas correctes" + { + try + { + if (!ModelState.IsValid) + { + return BadRequest(new ApiResponse("Les données du joueur sont invalides.")); + } + + var player = dtoPlayer.ToPlayer(); + + var playerTest = await _dataManager.GetPlayer(id); + if (playerTest == null) + { + return NotFound(new ApiResponse("Joueur non trouvé.")); + } + + await _dataManager.UpdatePlayer(id, player.name); - Player playerTeste = await _dataManager.GetPlayer(id); - if (playerTeste != null) - return StatusCode((int)HttpStatusCode.NotFound); //"Le player n'existe pas." + // Ajout des liens HATEOAS + var response = new ApiResponse("Joueur mis à jour avec succès."); + response.Links.Add(new ApiLink( + Url.Action("GetPlayer", "Player", new { id }), + "self", + "GET" + )); + response.Links.Add(new ApiLink( + Url.Action ("RemovePlayer", "Player", new { id }), + "delete", + "DELETE" + )); - var player = new Player + + return Ok(response); + } + catch (Exception ex) { - playerId = dtoPlayer.playerId, - name = dtoPlayer.name, - nbBallTouchTotal = dtoPlayer.nbBallTouchTotal, - timePlayed = dtoPlayer.timePlayed, - }; - - Player playerUpdate = await _dataManager.GetPlayer(id); - await _dataManager.UpdatePlayer(id,player.name); - return StatusCode((int)HttpStatusCode.OK); //"Le champion a été modifié." - } + _logger.LogError(ex, $"Une erreur est survenue lors de la modification du joueur avec l'id {id}."); + return StatusCode((int)HttpStatusCode.InternalServerError, new ApiResponse("Une erreur est survenue lors de la modification du joueur.")); + } + } } } diff --git a/code/server/ApiLeapHit/Mapper/ChatMapper.cs b/code/server/ApiLeapHit/Mapper/ChatMapper.cs new file mode 100644 index 0000000..ced8900 --- /dev/null +++ b/code/server/ApiLeapHit/Mapper/ChatMapper.cs @@ -0,0 +1,29 @@ +using DataBase.Entity; +using DTO; + +namespace ApiLeapHit.Mapper +{ + public static class ChatMapper + { + public static DTOChat ToDto(this Chat chat, Player player1, Player player2) + { + DTOChat dtoChat = new DTOChat() + { + chatId = chat.chatId, + PlayerId1 = player1.ToDto(), + PlayerId2 = player2.ToDto() + }; + return dtoChat; + } + + public static Chat ToChat(this DTOChat dtoChat, Player player1, Player player2) + { + return new Chat + { + chatId = dtoChat.chatId, + player1 = player1.playerId, + player2 = player2.playerId + }; + } + } +} diff --git a/code/server/ApiLeapHit/Mapper/MessageMapper.cs b/code/server/ApiLeapHit/Mapper/MessageMapper.cs new file mode 100644 index 0000000..573f1a4 --- /dev/null +++ b/code/server/ApiLeapHit/Mapper/MessageMapper.cs @@ -0,0 +1,21 @@ +using DataBase.Entity; +using DTO; + +namespace ApiLeapHit.Mapper +{ + public static class MessageMapper + { + public static DTOMessage ToDto(this Message message, Player player, Chat chat) + { + DTOMessage dtoMessage = new DTOMessage() + { + messageId = message.messageId, + message = message.message, + timestamp = message.timestamp, + PlayerId = player.ToDto(), + //ChatId = chat.ToDto() + }; + return dtoMessage; + } + } +} diff --git a/code/server/ApiLeapHit/Mapper/PlayerMapper.cs b/code/server/ApiLeapHit/Mapper/PlayerMapper.cs index b828e76..b8d2d07 100644 --- a/code/server/ApiLeapHit/Mapper/PlayerMapper.cs +++ b/code/server/ApiLeapHit/Mapper/PlayerMapper.cs @@ -16,5 +16,16 @@ namespace ApiLeapHit.Mapper }; return dtoPlayer; } + + public static Player ToPlayer(this DTOPlayer dtoPlayer) + { + return new Player + { + playerId = dtoPlayer.playerId, + name = dtoPlayer.name, + nbBallTouchTotal = dtoPlayer.nbBallTouchTotal, + timePlayed = dtoPlayer.timePlayed + }; + } } } diff --git a/code/server/DTO/Factory/ApiLink.cs b/code/server/DTO/Factory/ApiLink.cs new file mode 100644 index 0000000..c9ea3ec --- /dev/null +++ b/code/server/DTO/Factory/ApiLink.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DTO.Factory +{ + public class ApiLink + { + public string Href { get; set; } + public string Rel { get; set; } + public string Method { get; set; } + + public ApiLink(string href, string rel, string method) + { + Href = href; + Rel = rel; + Method = method; + } + } +} diff --git a/code/server/DTO/Factory/ApiResponse.cs b/code/server/DTO/Factory/ApiResponse.cs index e6db510..1cf32a6 100644 --- a/code/server/DTO/Factory/ApiResponse.cs +++ b/code/server/DTO/Factory/ApiResponse.cs @@ -10,6 +10,8 @@ namespace DTO.Factory { public string Message { get; set; } public T Data { get; set; } + public List Links { get; set; } = new List(); + public ApiResponse(string message, T data = default) { diff --git a/code/server/DataBase/DataManager/DbDataManager.Chat.cs b/code/server/DataBase/DataManager/DbDataManager.Chat.cs index bb38ac7..b15c133 100644 --- a/code/server/DataBase/DataManager/DbDataManager.Chat.cs +++ b/code/server/DataBase/DataManager/DbDataManager.Chat.cs @@ -42,7 +42,32 @@ namespace DataBase.DataManager return Task.FromResult(chats); } } + public Task GetChat(int id) + { + using (var context = new PongDbContext()) + { + var chat = context.Chats.Where(g => g.chatId == id).ToList().FirstOrDefault(); + return Task.FromResult(chat); + } + } + + public Task> GetChatsByIdPlayer(int id) + { + using (var context = new PongDbContext()) + { + var chats = context.Chats.Where(g => g.player1 == id || g.player2 == id).ToList(); + return Task.FromResult(chats); + } + } + public Task> GetChatsByIdPlayers(int idPlayer1, int idPlayer2) + { + using (var context = new PongDbContext()) + { + var chats = context.Chats.Where(g => (g.player1 == idPlayer1 && g.player2 == idPlayer2) || (g.player1 == idPlayer2 && g.player2 == idPlayer1)).ToList(); + return Task.FromResult(chats); + } + } } } diff --git a/code/server/DataBase/DataManager/DbDataManager.Player.cs b/code/server/DataBase/DataManager/DbDataManager.Player.cs index 44919b2..6ed56a6 100644 --- a/code/server/DataBase/DataManager/DbDataManager.Player.cs +++ b/code/server/DataBase/DataManager/DbDataManager.Player.cs @@ -58,5 +58,14 @@ namespace DataBase.DataManager return Task.FromResult(player); } } + + public Task> GetPlayers() + { + using (var context = new PongDbContext()) + { + var players = context.Players.ToList(); + return Task.FromResult(players); + } + } } } diff --git a/code/server/DataBase/PongDB.db b/code/server/DataBase/PongDB.db index 3905c29bfea6fa6cd337514c2e01aa02d655ab00..4d4ba40eb910847a1642f69fec79694513408cb6 100644 GIT binary patch delta 204 zcmW-aF$%&!6h!~eZg#UVGD&4)VWpjT11})xHLL`^KyD!7MT9+osVxLc16Cp^DuN&( zXyGQ!n_}KDX(rN4Y@&gOqfI({n5Y#5quG4Au$SQ-tk;KezbTqT#3%_R-Zn|EXp=VV z`7Fsr)k@@q4<0xpw@JK1Lu*Ar;A*YxW!8@%I)M&v8)tV+0wO6jDPd@!j6&dpCkk9_ zoE#CDAaKlAwp`D~^mST=ZK|XvZND+&kWmZt&Z$wk$1A3u)SBI{8j=;0kt6raXas&} S(ctBpH~3mBHl%EOFv%Zl5ip_v