From 1d39ae9537153e03ee4690c46496f3ab9735e0bc Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 29 Feb 2020 21:12:26 +0100 Subject: [PATCH] Player models and interfaces --- EstusShots.Server/Models/Episode.cs | 4 + EstusShots.Server/Models/EpisodePlayers.cs | 13 ++ EstusShots.Server/Models/Player.cs | 23 +++ .../Services/EstusShotsContext.cs | 14 ++ EstusShots.Shared/Dto/Player.cs | 19 ++ .../Interfaces/IPlayersController.cs | 40 +++++ .../Models/Parameters/PlayerParameters.cs | 163 ++++++++++++++++++ 7 files changed, 276 insertions(+) create mode 100644 EstusShots.Server/Models/EpisodePlayers.cs create mode 100644 EstusShots.Server/Models/Player.cs create mode 100644 EstusShots.Shared/Dto/Player.cs create mode 100644 EstusShots.Shared/Interfaces/IPlayersController.cs create mode 100644 EstusShots.Shared/Models/Parameters/PlayerParameters.cs diff --git a/EstusShots.Server/Models/Episode.cs b/EstusShots.Server/Models/Episode.cs index ccfd4d1..2d5498a 100644 --- a/EstusShots.Server/Models/Episode.cs +++ b/EstusShots.Server/Models/Episode.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace EstusShots.Server.Models @@ -20,5 +22,7 @@ namespace EstusShots.Server.Models public Guid SeasonId { get; set; } public Season Season { get; set; } = default!; + + public ICollection EpisodePlayers { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/EpisodePlayers.cs b/EstusShots.Server/Models/EpisodePlayers.cs new file mode 100644 index 0000000..54eb411 --- /dev/null +++ b/EstusShots.Server/Models/EpisodePlayers.cs @@ -0,0 +1,13 @@ +using System; + +namespace EstusShots.Server.Models +{ + public class EpisodePlayers + { + public Guid EpisodeId { get; set; } = default!; + public Episode Episode { get; set; } = default!; + + public Guid PlayerId { get; set; } = default!; + public Player Player { get; set; } = default!; + } +} \ No newline at end of file diff --git a/EstusShots.Server/Models/Player.cs b/EstusShots.Server/Models/Player.cs new file mode 100644 index 0000000..2ded57d --- /dev/null +++ b/EstusShots.Server/Models/Player.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace EstusShots.Server.Models +{ + public class Player + { + public Guid PlayerId { get; set; } + + [MaxLength(4)] public string? HexId { get; set; } + + [MaxLength(30)] public string Name { get; set; } = default!; + + [MaxLength(30)] public string Alias { get; set; } = default!; + + public bool Anonymous { get; set; } + + public string DisplayName => Anonymous ? Alias : Name; + + public ICollection EpisodePlayers { get; set; } = default!; + } +} \ No newline at end of file diff --git a/EstusShots.Server/Services/EstusShotsContext.cs b/EstusShots.Server/Services/EstusShotsContext.cs index e202ae2..b28ecb1 100644 --- a/EstusShots.Server/Services/EstusShotsContext.cs +++ b/EstusShots.Server/Services/EstusShotsContext.cs @@ -12,11 +12,25 @@ namespace EstusShots.Server.Services public DbSet Seasons { get; set; } = default!; public DbSet Episodes { get; set; } = default!; + public DbSet Players { get; set; } = default!; protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().ToTable(nameof(Season)); modelBuilder.Entity().ToTable(nameof(Episode)); + + modelBuilder.Entity() + .HasKey(t => new {t.EpisodeId, t.PlayerId}); + + modelBuilder.Entity() + .HasOne(pt => pt.Episode) + .WithMany(p => p.EpisodePlayers) + .HasForeignKey(pt => pt.EpisodeId); + + modelBuilder.Entity() + .HasOne(pt => pt.Player) + .WithMany(t => t.EpisodePlayers) + .HasForeignKey(pt => pt.PlayerId); } } } \ No newline at end of file diff --git a/EstusShots.Shared/Dto/Player.cs b/EstusShots.Shared/Dto/Player.cs new file mode 100644 index 0000000..7ca0e4f --- /dev/null +++ b/EstusShots.Shared/Dto/Player.cs @@ -0,0 +1,19 @@ +using System; + +namespace EstusShots.Shared.Dto +{ + public class Player + { + public Guid PlayerId { get; set; } + + public string HexId { get; set; } + + public string Name { get; set; } + + public string Alias { get; set; } + + public bool Anonymous { get; set; } + + public string DisplayName => Anonymous ? Alias : Name; + } +} \ No newline at end of file diff --git a/EstusShots.Shared/Interfaces/IPlayersController.cs b/EstusShots.Shared/Interfaces/IPlayersController.cs new file mode 100644 index 0000000..b88ea0d --- /dev/null +++ b/EstusShots.Shared/Interfaces/IPlayersController.cs @@ -0,0 +1,40 @@ +using System.Threading.Tasks; +using EstusShots.Shared.Models; +using EstusShots.Shared.Models.Parameters; + +namespace EstusShots.Shared.Interfaces +{ + /// + /// Load and manipulate player objects + /// + public interface IPlayersController + { + /// + /// Loads a list of all players in the database + /// + /// An instance + /// An ApiResponse instance of type + Task> GetPlayers(GetPlayersParameter parameter); + + /// + /// Loads detailed information on a single player + /// + /// An instance + /// An ApiResponse instance of type + Task> GetPlayerDetails(GetPlayerDetailsParameter parameter); + + /// + /// Creates or updates a player object + /// + /// An instance + /// An ApiResponse instance of type + Task> SavePlayer(SavePlayerParameter parameter); + + /// + /// Deletes a player + /// + /// An instance + /// An ApiResponse instance of type + Task> DeletePlayers(DeletePlayerParameter parameter); + } +} \ No newline at end of file diff --git a/EstusShots.Shared/Models/Parameters/PlayerParameters.cs b/EstusShots.Shared/Models/Parameters/PlayerParameters.cs new file mode 100644 index 0000000..8174865 --- /dev/null +++ b/EstusShots.Shared/Models/Parameters/PlayerParameters.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using EstusShots.Shared.Dto; +using EstusShots.Shared.Interfaces; + +namespace EstusShots.Shared.Models.Parameters +{ + # region GetPlayers + + /// + /// Parameter class for the GetPlayers API controller. + /// + public class GetPlayersParameter : IApiParameter + { + public GetPlayersParameter() + { + } + } + + /// + /// Parameter class returned from the GetPlayers API controller. + /// + public class GetPlayersResponse : IApiResponse + { + /// + /// All players in the database + /// + public List Players { get; set; } + + public GetPlayersResponse(List players) + { + Players = players; + } + + public GetPlayersResponse() + { + } + } + + # endregion + + # region GetPlayerDetails + + /// + /// Parameter class for the GetPlayerDetails API controller. + /// + public class GetPlayerDetailsParameter : IApiParameter + { + /// + /// ID of the player that should be loaded + /// + public Guid PlayerId { get; set; } + + public GetPlayerDetailsParameter(Guid playerId) + { + PlayerId = playerId; + } + + public GetPlayerDetailsParameter() + { + } + } + + /// + /// Parameter class returned from the GetPlayerDetails API controller. + /// + public class GetPlayerDetailsResponse : IApiResponse + { + /// + /// The loaded player + /// + public Player Player { get; set; } + + public GetPlayerDetailsResponse(Player player) + { + Player = player; + } + + public GetPlayerDetailsResponse() + { + } + } + + # endregion + + # region SavePlayer + + /// + /// Parameter class for the SavePlayer API controller. + /// + public class SavePlayerParameter : IApiParameter + { + /// + /// The player to save + /// + public Player Player { get; set; } + + public SavePlayerParameter(Player player) + { + Player = player; + } + + public SavePlayerParameter() + { + } + } + + /// + /// Parameter class returned from the SavePlayer API controller. + /// + public class SavePlayerResponse : IApiResponse + { + /// + /// ID of the newly created or updated player + /// + public Guid PlayerId { get; set; } + + public SavePlayerResponse(Guid playerId) + { + PlayerId = playerId; + } + + public SavePlayerResponse() + { + } + } + + # endregion + + # region DeletePlayer + + /// + /// Parameter class for the DeletePlayer API controller. + /// + public class DeletePlayerParameter : IApiParameter + { + /// + /// ID of the player that should be deleted + /// + public Guid PlayerId { get; set; } + + public DeletePlayerParameter(Guid playerId) + { + PlayerId = playerId; + } + + public DeletePlayerParameter() + { + } + } + + /// + /// Parameter class returned from the DeletePlayer API controller. + /// + public class DeletePlayerResponse : IApiResponse + { + public DeletePlayerResponse() + { + } + } + + # endregion +} \ No newline at end of file