From 2e7aed8d491f2a8d1675caaacfd4e1cb8f04b72e Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 7 Mar 2020 10:57:15 +0100 Subject: [PATCH] Enemy classes and controllers --- .../Controllers/EnemiesController.cs | 58 ++++++ EstusShots.Server/Mapping/Profiles.cs | 3 + EstusShots.Server/Models/Drink.cs | 3 +- EstusShots.Server/Models/Enemy.cs | 20 ++ EstusShots.Server/Models/Season.cs | 2 + EstusShots.Server/Services/EnemiesService.cs | 43 +++++ EstusShots.Server/Startup.cs | 1 + EstusShots.Shared/Dto/Enemy.cs | 20 ++ .../Interfaces/IEnemiesController.cs | 40 ++++ .../Models/Parameters/EnemyParameters.cs | 174 ++++++++++++++++++ 10 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 EstusShots.Server/Controllers/EnemiesController.cs create mode 100644 EstusShots.Server/Models/Enemy.cs create mode 100644 EstusShots.Server/Services/EnemiesService.cs create mode 100644 EstusShots.Shared/Dto/Enemy.cs create mode 100644 EstusShots.Shared/Interfaces/IEnemiesController.cs create mode 100644 EstusShots.Shared/Models/Parameters/EnemyParameters.cs diff --git a/EstusShots.Server/Controllers/EnemiesController.cs b/EstusShots.Server/Controllers/EnemiesController.cs new file mode 100644 index 0000000..c5d66ae --- /dev/null +++ b/EstusShots.Server/Controllers/EnemiesController.cs @@ -0,0 +1,58 @@ +using System; +using System.Threading.Tasks; +using EstusShots.Server.Services; +using EstusShots.Shared.Interfaces; +using EstusShots.Shared.Models; +using EstusShots.Shared.Models.Parameters; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace EstusShots.Server.Controllers +{ + [ApiController] + [Route("/api/[controller]/[action]")] + public class EnemiesController : ControllerBase, IEnemiesController + { + private readonly EnemiesService _service; + private readonly ILogger _logger; + + public EnemiesController(EnemiesService service, ILogger logger) + { + _service = service; + _logger = logger; + } + + [HttpPost] + public async Task> GetEnemies(GetEnemiesParameter parameter) + => await ServiceCall(() => _service.GetEnemies(parameter)); + + [HttpPost] + public async Task> GetEnemy(GetEnemyParameter parameter) + => await ServiceCall(() => _service.GetEnemy(parameter)); + + [HttpPost] + public async Task> SaveEnemy(SaveEnemyParameter parameter) + => await ServiceCall(() => _service.SaveEnemy(parameter)); + + [HttpPost] + public async Task> DeleteEnemy(DeleteEnemyParameter parameter) + => await ServiceCall(() => _service.DeleteEnemy(parameter)); + + private async Task> ServiceCall(Func>> serviceCall) + where T : class, IApiResponse, new() + { + try + { + if (!ModelState.IsValid) _logger.LogError($"Model invalid"); + _logger.LogInformation( + $"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'"); + return await serviceCall(); + } + catch (Exception e) + { + _logger.LogError(e, "Exception Occured"); + return new ApiResponse(new OperationResult(e)); + } + } + } +} \ No newline at end of file diff --git a/EstusShots.Server/Mapping/Profiles.cs b/EstusShots.Server/Mapping/Profiles.cs index cf60037..fd5f4b0 100644 --- a/EstusShots.Server/Mapping/Profiles.cs +++ b/EstusShots.Server/Mapping/Profiles.cs @@ -18,6 +18,9 @@ namespace EstusShots.Server.Mapping CreateMap(); CreateMap(); + + CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/EstusShots.Server/Models/Drink.cs b/EstusShots.Server/Models/Drink.cs index f277478..f542f54 100644 --- a/EstusShots.Server/Models/Drink.cs +++ b/EstusShots.Server/Models/Drink.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel.DataAnnotations; namespace EstusShots.Server.Models { @@ -6,7 +7,7 @@ namespace EstusShots.Server.Models { public Guid DrinkId { get; set; } - public string Name { get; set; } = default!; + [MaxLength(50)] public string Name { get; set; } = default!; public double Vol { get; set; } } diff --git a/EstusShots.Server/Models/Enemy.cs b/EstusShots.Server/Models/Enemy.cs new file mode 100644 index 0000000..98c1429 --- /dev/null +++ b/EstusShots.Server/Models/Enemy.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace EstusShots.Server.Models +{ + public class Enemy + { + public Guid EnemyId { get; set; } + + [MaxLength(50)] public string Name { get; set; } = default!; + + public bool Boss { get; set; } + + public bool Defeated { get; set; } + + public Guid? SeasonId { get; set; } + + public Season? Season { get; set; } + } +} \ No newline at end of file diff --git a/EstusShots.Server/Models/Season.cs b/EstusShots.Server/Models/Season.cs index 423854e..6965b0b 100644 --- a/EstusShots.Server/Models/Season.cs +++ b/EstusShots.Server/Models/Season.cs @@ -19,5 +19,7 @@ namespace EstusShots.Server.Models public DateTime? End { get; set; } public List Episodes { get; set; } = default!; + + public List Enemies { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Services/EnemiesService.cs b/EstusShots.Server/Services/EnemiesService.cs new file mode 100644 index 0000000..4f0620a --- /dev/null +++ b/EstusShots.Server/Services/EnemiesService.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using AutoMapper; +using EstusShots.Shared.Interfaces; +using EstusShots.Shared.Models; +using EstusShots.Shared.Models.Parameters; +using Microsoft.Extensions.Logging; + +namespace EstusShots.Server.Services +{ + public class EnemiesService : IEnemiesController + { + private readonly ILogger _logger; + private readonly IMapper _mapper; + private readonly EstusShotsContext _context; + + public EnemiesService(ILogger logger, IMapper mapper, EstusShotsContext context) + { + _logger = logger; + _mapper = mapper; + _context = context; + } + + public Task> GetEnemies(GetEnemiesParameter parameter) + { + throw new System.NotImplementedException(); + } + + public Task> GetEnemy(GetEnemyParameter parameter) + { + throw new System.NotImplementedException(); + } + + public Task> SaveEnemy(SaveEnemyParameter parameter) + { + throw new System.NotImplementedException(); + } + + public Task> DeleteEnemy(DeleteEnemyParameter parameter) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/EstusShots.Server/Startup.cs b/EstusShots.Server/Startup.cs index 76fc110..df530af 100644 --- a/EstusShots.Server/Startup.cs +++ b/EstusShots.Server/Startup.cs @@ -49,6 +49,7 @@ namespace EstusShots.Server services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/EstusShots.Shared/Dto/Enemy.cs b/EstusShots.Shared/Dto/Enemy.cs new file mode 100644 index 0000000..5448b0a --- /dev/null +++ b/EstusShots.Shared/Dto/Enemy.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace EstusShots.Shared.Dto +{ + public class Enemy + { + public Guid EnemyId { get; set; } + + public string Name { get; set; } + + public bool Boss { get; set; } + + public bool Defeated { get; set; } + + public Guid? SeasonId { get; set; } + + public Season Season { get; set; } + } +} \ No newline at end of file diff --git a/EstusShots.Shared/Interfaces/IEnemiesController.cs b/EstusShots.Shared/Interfaces/IEnemiesController.cs new file mode 100644 index 0000000..30619e8 --- /dev/null +++ b/EstusShots.Shared/Interfaces/IEnemiesController.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 Enemy objects + /// + public interface IEnemiesController + { + /// + /// Load all enemies or enemies for a specific season + /// + /// An instance + /// An ApiResponse instance of type + Task> GetEnemies(GetEnemiesParameter parameter); + + /// + /// Load detailed information on a single enemy + /// + /// An instance + /// An ApiResponse instance of type + Task> GetEnemy(GetEnemyParameter parameter); + + /// + /// Creates or updates an enemy object + /// + /// An instance + /// An ApiResponse instance of type + Task> SaveEnemy(SaveEnemyParameter parameter); + + /// + /// Deletes an enemy object + /// + /// An instance + /// An ApiResponse instance of type + Task> DeleteEnemy(DeleteEnemyParameter parameter); + } +} \ No newline at end of file diff --git a/EstusShots.Shared/Models/Parameters/EnemyParameters.cs b/EstusShots.Shared/Models/Parameters/EnemyParameters.cs new file mode 100644 index 0000000..c7b8227 --- /dev/null +++ b/EstusShots.Shared/Models/Parameters/EnemyParameters.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using EstusShots.Shared.Dto; +using EstusShots.Shared.Interfaces; + +namespace EstusShots.Shared.Models.Parameters +{ + # region GetEnemies + + /// + /// Parameter class for the GetEnemies API controller. + /// + public class GetEnemiesParameter : IApiParameter + { + /// + /// (Optional) Load enemies for this season + /// + public Guid SeasonId { get; set; } + + public GetEnemiesParameter(Guid seasonId) + { + SeasonId = seasonId; + } + + public GetEnemiesParameter() + { + SeasonId = Guid.Empty; + } + } + + /// + /// Parameter class returned from the GetEnemies API controller. + /// + public class GetEnemiesResponse : IApiResponse + { + /// + /// The loaded enemies + /// + public List Enemies { get; set; } + + public GetEnemiesResponse(List enemies) + { + Enemies = enemies; + } + + public GetEnemiesResponse() + { + } + } + + # endregion + + # region GetEnemy + + /// + /// Parameter class for the GetEnemy API controller. + /// + public class GetEnemyParameter : IApiParameter + { + /// + /// ID of the enemy to load + /// + public Guid EnemyId { get; set; } + + public GetEnemyParameter(Guid enemyId) + { + EnemyId = enemyId; + } + + public GetEnemyParameter() + { + } + } + + /// + /// Parameter class returned from the GetEnemy API controller. + /// + public class GetEnemyResponse : IApiResponse + { + /// + /// A detailed Enemy object + /// + public Enemy Enemy { get; set; } + + public GetEnemyResponse(Enemy enemy) + { + Enemy = enemy; + } + + public GetEnemyResponse() + { + } + } + + # endregion + + # region SaveEnemy + + /// + /// Parameter class for the SaveEnemy API controller. + /// + public class SaveEnemyParameter : IApiParameter + { + /// + /// The enemy object to create or update + /// + public Enemy Enemy { get; set; } + + public SaveEnemyParameter(Enemy enemy) + { + Enemy = enemy; + } + + public SaveEnemyParameter() + { + } + } + + /// + /// Parameter class returned from the SaveEnemy API controller. + /// + public class SaveEnemyResponse : IApiResponse + { + /// + /// ID of the created or updated enemy object + /// + public Guid EnemyId { get; set; } + + public SaveEnemyResponse(Guid enemyId) + { + EnemyId = enemyId; + } + + public SaveEnemyResponse() + { + } + } + + # endregion + + # region DeleteEnemy + + /// + /// Parameter class for the DeleteEnemy API controller. + /// + public class DeleteEnemyParameter : IApiParameter + { + /// + /// ID of the enemy to delete + /// + public Guid EnemyId { get; set; } + + public DeleteEnemyParameter(Guid enemyId) + { + EnemyId = enemyId; + } + + public DeleteEnemyParameter() + { + } + } + + /// + /// Parameter class returned from the DeleteEnemy API controller. + /// + public class DeleteEnemyResponse : IApiResponse + { + public DeleteEnemyResponse() + { + } + } + + # endregion +} \ No newline at end of file