diff --git a/Sources/Model/Case.cs b/Sources/Model/Case.cs index 18f2ca3..f6e2566 100644 --- a/Sources/Model/Case.cs +++ b/Sources/Model/Case.cs @@ -8,13 +8,14 @@ namespace Model { public class Case { + public int Id { get; set; } public int Valeur { get => valeur; set { //pas évolutif car case dangereuse c'est 6 MAX - if (value > 12) + if (value > 12 || value < 0) { throw new ArgumentException("a Case must have a value lower or equal to 12"); } @@ -23,9 +24,17 @@ namespace Model } private int valeur; - public Case(int valeur) + //public Case(int valeur) + //{ + // Valeur = valeur; + //} + public Case() { - Valeur = valeur; + } + + public void AddValue(int valeur) + { + this.valeur = valeur; } } } diff --git a/Sources/Model/Game.cs b/Sources/Model/Game.cs index 985d0f3..e2f79b3 100644 --- a/Sources/Model/Game.cs +++ b/Sources/Model/Game.cs @@ -9,10 +9,12 @@ namespace Model { public class Game { + public int Id { get; set; } + public TimeSpan Duration { get; set; } public DateOnly Date { get; set; } - public ReadOnlyCollection Players { get; private set; } - private List players = new(); + //public ReadOnlyCollection Players { get; private set; } + //private List players = new(); public ReadOnlyCollection Turns { get; private set; } private List turns = new(); @@ -25,28 +27,70 @@ namespace Model public GameMode GameMode { get; set; } - //public Grille Grille + + //public Game(TimeSpan duration, DateOnly date, Dictionary grilles, Dictionary scores, List turns, GameMode gameMode,int id=0) //{ - // get => grille; - // private init - // { - // if (value == null) - // throw new ArgumentNullException("A grid can't be null for a game"); - // grille = value; - // } - //} - //private Grille grille; + // Players = players.AsReadOnly(); + // Duration = duration; + // Date = date; + // Grilles = new ReadOnlyDictionary(grilles); + // Scores = new ReadOnlyDictionary(scores); + // Turns = turns.AsReadOnly(); + // GameMode = gameMode; + // Id = id; - public Game(TimeSpan duration, DateOnly date, Dictionary grilles, Dictionary scores, List turns, GameMode gameMode) + //} + public Game(DateOnly date, Player owner, GameMode gameMode, int id = 0) { - Players = players.AsReadOnly(); - Duration = duration; Date = date; Grilles = new ReadOnlyDictionary(grilles); Scores = new ReadOnlyDictionary(scores); - Turns = turns.AsReadOnly(); + Turns = new ReadOnlyCollection(turns); + grilles.Add(owner, new Grille()); + scores.Add(owner, 0); GameMode = gameMode; + Id = id; + + } + public bool AddPlayerToGame(Player player) + { + if(grilles.ContainsKey(player) == false && scores.ContainsKey(player) == false) + { + grilles.Add(player, new Grille()); + scores.Add(player, 0); + return true; + } + return false; + } + + public bool AddScoreToPlayer(Player player, int score) + { + if (grilles.ContainsKey(player) == true && scores.ContainsKey(player) == true) + { + scores[player] = score; + return true; + } + return false; + } + + public bool AddCaseValue(Player player, int value, int index) + { + if (grilles.ContainsKey(player) == true && scores.ContainsKey(player) == true) + { + return grilles[player].AddValueToCase(value, index); + } + return false; + } + + public void AddTurn(Turn turn) + { + turns.Add(turn); + } + + public void AddTime(TimeSpan time) + { + Duration = time; } } } diff --git a/Sources/Model/GameMode.cs b/Sources/Model/GameMode.cs index 0aadd1b..67377e2 100644 --- a/Sources/Model/GameMode.cs +++ b/Sources/Model/GameMode.cs @@ -8,6 +8,8 @@ namespace Model { public class GameMode { + public int Id { get; set; } + public string Name { get => name; diff --git a/Sources/Model/Grille.cs b/Sources/Model/Grille.cs index fda42b8..9dca9e5 100644 --- a/Sources/Model/Grille.cs +++ b/Sources/Model/Grille.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; namespace Model { + public int Id { get; set; } public class Grille { public int NbChaine { get; set; } @@ -18,9 +19,25 @@ namespace Model private List cases = new(); - public Grille(List cases) + //public Grille(List cases) + //{ + // Cases = cases.AsReadOnly(); + //} + + public Grille() + { + Cases = new ReadOnlyCollection(cases); + cases.AddRange((Enumerable.Repeat(new Case(), 19))); + } + + public bool AddValueToCase(int value, int index) { - Cases = cases.AsReadOnly(); + if(index > 0 || index <= cases.Count) + { + cases[index - 1].Valeur = value; + return true; + } + return false; } } } diff --git a/Sources/Model/IDataManager.cs b/Sources/Model/IDataManager.cs index 3d9c4aa..0a5f475 100644 --- a/Sources/Model/IDataManager.cs +++ b/Sources/Model/IDataManager.cs @@ -20,10 +20,21 @@ namespace Model public interface IPlayersManager : IGenericDataManager { - } + Task> GetItemsByPseudo(string charPseudo, int index, int count, string? orderingPropertyName, bool descending = false); + Task GetNbItemsByPseudo(string charPseudo); + + //byId ? + + } public interface IGamesManager : IGenericDataManager { + Task AddPlayer(Player player); + Task AddScoreToPlayer(int id, int score); + Task AddCaseValueToPlayer(int id, int value, int index); + Task AddTurn(Turn turn); + Task AddTime(TimeSpan time); + } public interface IGamesModeManager : IGenericDataManager diff --git a/Sources/Model/Player.cs b/Sources/Model/Player.cs index 315ee58..6e44458 100644 --- a/Sources/Model/Player.cs +++ b/Sources/Model/Player.cs @@ -1,7 +1,8 @@ namespace Model; -//public class Player : IEquatable - public class Player + public class Player : IEquatable { + + public int Id { get; set; } public string Pseudo { get => pseudo; @@ -25,21 +26,46 @@ Stats = new Stats(); } - public Player(string pseudo, Stats stats) + public Player(string pseudo, Stats stats, int id=0) { Pseudo = pseudo; Stats = stats; + Id = id; + } + + public void AddWin() + { + Stats.NbWin += 1; + } + + public void AddPlayed() + { + Stats.NbPlayed += 1; + } + + public void AddMaxChain(int maxChain) + { + Stats.MaxChain = maxChain; + } + + public void AddMaxZone(int maxZone) + { + Stats.MaxZone = maxZone; + } + + public void AddMaxPoints(int maxPts) + { + Stats.MaxPoints = maxPts; } - //nécessaire ? - //public bool Equals(Player? other) - // => Pseudo.Equals(other?.Pseudo); + public bool Equals(Player? other) + => Pseudo.ToLower().Equals(other?.Pseudo.ToLower()); //997 ou un autre chiffre, à voir - //public override int GetHashCode() - // => Pseudo.GetHashCode() % 997; + public override int GetHashCode() + => Pseudo.GetHashCode() % 997; - //public override string ToString() - // => $"{Pseudo}"; + public override string ToString() + => $"{Pseudo}"; } diff --git a/Sources/Model/Stats.cs b/Sources/Model/Stats.cs index 0603f37..c703cc9 100644 --- a/Sources/Model/Stats.cs +++ b/Sources/Model/Stats.cs @@ -8,6 +8,7 @@ namespace Model { public class Stats { + public int Id { get; set; } public int NbWin { get; set; } = 0; public int NbPlayed { get; set; } = 0; public int MaxChain { get; set; } = 0; diff --git a/Sources/Model/Turn.cs b/Sources/Model/Turn.cs index b9071c4..6bddaf0 100644 --- a/Sources/Model/Turn.cs +++ b/Sources/Model/Turn.cs @@ -8,6 +8,8 @@ namespace Model { public class Turn { + public int Id { get; set; } + public int DiceValue1 { get => diceValue1; diff --git a/Sources/Stub/Stub/StubData.Players.cs b/Sources/Stub/Stub/StubData.Players.cs index c895578..da8abe5 100644 --- a/Sources/Stub/Stub/StubData.Players.cs +++ b/Sources/Stub/Stub/StubData.Players.cs @@ -41,6 +41,16 @@ namespace Stub public Task UpdateItem(Player? oldItem, Player? newItem) => parent.players.UpdateItem(oldItem, newItem); + + private Func filterByPseudo = (player, substring) => player.Pseudo.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public Task> GetItemsByPseudo(string charPseudo, int index, int count, string? orderingPropertyName, bool descending = false) + => parent.players.GetItemsWithFilterAndOrdering(player => filterByPseudo(player, charPseudo), index, count, orderingPropertyName, descending); + + public Task GetNbItemsByPseudo(string charPseudo) + { + throw new NotImplementedException(); + } } } } diff --git a/Sources/Trek12_API/Controllers/PlayerController.cs b/Sources/Trek12_API/Controllers/PlayerController.cs index ed77754..eb62d55 100644 --- a/Sources/Trek12_API/Controllers/PlayerController.cs +++ b/Sources/Trek12_API/Controllers/PlayerController.cs @@ -20,20 +20,57 @@ namespace Trek12_API.Controllers _logger = logger; } + //[HttpGet] + //public async Task Get(int index, int count, string? order = null, bool descending = false ) + //{ + // //si count > nb_max + // //_logger.LogWarning + reaffecter count + // //var list = await playersManager.GetItems(0, await playersManager.GetNbItems(), order, descending); + // var list = await playersManager.GetItems(index, count, order, descending); + // return Ok(list.Select(player => player?.toDTO())); + + //} + [HttpGet] - public async Task Get() + public async Task Get(int index, int count, string? order = null, bool descending = false) { - //si count > nb_max - //_logger.LogWarning + reaffecter count - var list = await playersManager.GetItems(0, await playersManager.GetNbItems()); - return Ok(list.Select(player => player?.toDTO())); + try + { + if (index < 0) + { + _logger.LogWarning($"Invalid index value {index} in Get method."); + return BadRequest("Index must be a non-negative integer."); + } + if (count <= 0) + { + _logger.LogWarning($"Invalid count value {count} in Get method."); + return BadRequest("Count must be a positive integer."); + } + + var list = await playersManager.GetItems(index, count, order, descending); + + if (list == null || !list.Any()) + { + _logger.LogWarning($"No players found in Get method with index {index} and count {count}."); + return NotFound("No players found."); + } + + _logger.LogInformation($"Returning list of {list.Count()} players in Get method with index {index} and count {count}."); + return Ok(list.Select(player => player?.toDTO())); + } + catch (Exception ex) + { + _logger.LogError($"Error occurred in Get method with index {index} and count {count}: {ex.Message}"); + return StatusCode(500, "Internal server error."); + } } - [HttpGet] - public async Task GetById() + + [HttpGet("pseudo/{pseudo}")] + public async Task GetByPseudo([FromRoute] string pseudo, int index, int count, string? order = null, bool descending = false) { - var list = await playersManager.GetItems(0, await playersManager.GetNbItems()); - return Ok(list.Select(player => player?.toDTO())); + var player = await playersManager.GetItemsByPseudo(pseudo, index, count, order, descending); + return Ok(player?.toDTOs()); } [HttpPost] @@ -44,7 +81,7 @@ namespace Trek12_API.Controllers return Ok(playerToCreate?.toDTO()); } - [HttpDelete("{player}")] + [HttpDelete] public async Task Delete(PlayerDTO player) { var playerToDelete = player.toModel(); @@ -53,6 +90,15 @@ namespace Trek12_API.Controllers return Ok(); } + [HttpDelete("pseudo/{pseudo}")] + public async Task DeleteByPseudo(PlayerDTO player) + { + var playerToDelete = player.toModel(); + //faire recherche pour voir si player existe + await playersManager.DeleteItem(playerToDelete); + return Ok(); + } + [HttpPut] public async Task Update(string pseudo, PlayerDTO playerOld) { @@ -61,5 +107,45 @@ namespace Trek12_API.Controllers await playersManager.UpdateItem(playerOldModel, playerNew); return Ok(playerNew); } + + [HttpPut] + public async Task UpdateMaxChain(int newMaxChain, PlayerDTO playerOld) + { + Player playerOldModel = playerOld.toModel(); + Player playerNew = new Player(playerOldModel.Pseudo, playerOldModel.Stats); + playerNew.Stats.MaxChain = newMaxChain; + await playersManager.UpdateItem(playerOldModel, playerNew); + return Ok(playerNew); + } + + [HttpPut] + public async Task UpdateMaxPoints(int newMaxPoints, PlayerDTO playerOld) + { + Player playerOldModel = playerOld.toModel(); + Player playerNew = new Player(playerOldModel.Pseudo, playerOldModel.Stats); + playerNew.Stats.MaxPoints = newMaxPoints; + await playersManager.UpdateItem(playerOldModel, playerNew); + return Ok(playerNew); + } + + [HttpPut] + public async Task UpdateMaxZone(int newMaxZone, PlayerDTO playerOld) + { + Player playerOldModel = playerOld.toModel(); + Player playerNew = new Player(playerOldModel.Pseudo, playerOldModel.Stats); + playerNew.Stats.MaxZone = newMaxZone; + await playersManager.UpdateItem(playerOldModel, playerNew); + return Ok(playerNew); + } + + [HttpPut] + public async Task UpdateWin(int newMaxZone, PlayerDTO playerOld) + { + Player playerOldModel = playerOld.toModel(); + Player playerNew = new Player(playerOldModel.Pseudo, playerOldModel.Stats); + playerNew.AddWin(); + await playersManager.UpdateItem(playerOldModel, playerNew); + return Ok(playerNew); + } } } diff --git a/Sources/Trek12_API/Controllers/WeatherForecastController.cs b/Sources/Trek12_API/Controllers/WeatherForecastController.cs deleted file mode 100644 index 8c1502c..0000000 --- a/Sources/Trek12_API/Controllers/WeatherForecastController.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace Trek12_API.Controllers; - -[ApiController] -[Route("[controller]")] -public class WeatherForecastController : ControllerBase -{ - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - private readonly ILogger _logger; - - public WeatherForecastController(ILogger logger) - { - _logger = logger; - } - - [HttpGet(Name = "GetWeatherForecast")] - public IEnumerable Get() - { - return Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = DateTime.Now.AddDays(index), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }) - .ToArray(); - } -} - diff --git a/Sources/Trek12_API/DTO/GameDTO.cs b/Sources/Trek12_API/DTO/GameDTO.cs new file mode 100644 index 0000000..6af1a1a --- /dev/null +++ b/Sources/Trek12_API/DTO/GameDTO.cs @@ -0,0 +1,6 @@ +namespace Trek12_API.DTO +{ + public class GameDTO + { + } +} diff --git a/Sources/Trek12_API/WeatherForecast.cs b/Sources/Trek12_API/WeatherForecast.cs deleted file mode 100644 index 9023cc4..0000000 --- a/Sources/Trek12_API/WeatherForecast.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Trek12_API; - -public class WeatherForecast -{ - public DateTime Date { get; set; } - - public int TemperatureC { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - - public string? Summary { get; set; } -} -