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; namespace ApiLeapHit.Controllers { [Route("api/[controller]")] [ApiController] public class PlayerController : ControllerBase { private readonly DbDataManager _dataManager; private readonly ILogger _logger; public PlayerController(DbDataManager dataManager, ILogger logger) { _dataManager = dataManager; _logger = logger; } [HttpGet("{id}")] public async Task>> GetPlayer(int id) { try { 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" )); return Ok(response); } catch (Exception ex) { _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) { 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" )); var response2 = new ApiResponse("Joueur ajouté avec succès."); 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. {ex.Message}")); } } [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) { _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}")] public async Task RemovePlayer(int id) { try { var result = await _dataManager.RemovePlayer(id); if (result) { // 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(new ApiResponse("Joueur non trouvé.")); } catch (Exception ex) { _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) { 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); // 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" )); return Ok(response); } catch (Exception ex) { _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.")); } } } }