Enemy classes and controllers

This commit is contained in:
2020-03-07 10:57:15 +01:00
parent 5c6b19f360
commit 2e7aed8d49
10 changed files with 363 additions and 1 deletions

View File

@@ -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<EnemiesController> logger)
{
_service = service;
_logger = logger;
}
[HttpPost]
public async Task<ApiResponse<GetEnemiesResponse>> GetEnemies(GetEnemiesParameter parameter)
=> await ServiceCall(() => _service.GetEnemies(parameter));
[HttpPost]
public async Task<ApiResponse<GetEnemyResponse>> GetEnemy(GetEnemyParameter parameter)
=> await ServiceCall(() => _service.GetEnemy(parameter));
[HttpPost]
public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
=> await ServiceCall(() => _service.SaveEnemy(parameter));
[HttpPost]
public async Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter)
=> await ServiceCall(() => _service.DeleteEnemy(parameter));
private async Task<ApiResponse<T>> ServiceCall<T>(Func<Task<ApiResponse<T>>> 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<T>(new OperationResult(e));
}
}
}
}

View File

@@ -18,6 +18,9 @@ namespace EstusShots.Server.Mapping
CreateMap<Drink, Shared.Dto.Drink>(); CreateMap<Drink, Shared.Dto.Drink>();
CreateMap<Shared.Dto.Drink, Drink>(); CreateMap<Shared.Dto.Drink, Drink>();
CreateMap<Enemy, Shared.Dto.Enemy>();
CreateMap<Shared.Dto.Enemy, Enemy>();
} }
} }
} }

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.ComponentModel.DataAnnotations;
namespace EstusShots.Server.Models namespace EstusShots.Server.Models
{ {
@@ -6,7 +7,7 @@ namespace EstusShots.Server.Models
{ {
public Guid DrinkId { get; set; } public Guid DrinkId { get; set; }
public string Name { get; set; } = default!; [MaxLength(50)] public string Name { get; set; } = default!;
public double Vol { get; set; } public double Vol { get; set; }
} }

View File

@@ -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; }
}
}

View File

@@ -19,5 +19,7 @@ namespace EstusShots.Server.Models
public DateTime? End { get; set; } public DateTime? End { get; set; }
public List<Episode> Episodes { get; set; } = default!; public List<Episode> Episodes { get; set; } = default!;
public List<Enemy> Enemies { get; set; } = default!;
} }
} }

View File

@@ -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<EnemiesService> logger, IMapper mapper, EstusShotsContext context)
{
_logger = logger;
_mapper = mapper;
_context = context;
}
public Task<ApiResponse<GetEnemiesResponse>> GetEnemies(GetEnemiesParameter parameter)
{
throw new System.NotImplementedException();
}
public Task<ApiResponse<GetEnemyResponse>> GetEnemy(GetEnemyParameter parameter)
{
throw new System.NotImplementedException();
}
public Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
{
throw new System.NotImplementedException();
}
public Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter)
{
throw new System.NotImplementedException();
}
}
}

View File

@@ -49,6 +49,7 @@ namespace EstusShots.Server
services.AddScoped<EpisodesService>(); services.AddScoped<EpisodesService>();
services.AddScoped<PlayersService>(); services.AddScoped<PlayersService>();
services.AddScoped<DrinksService>(); services.AddScoped<DrinksService>();
services.AddScoped<EnemiesService>();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

View File

@@ -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; }
}
}

View File

@@ -0,0 +1,40 @@
using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
{
/// <summary>
/// Load and manipulate Enemy objects
/// </summary>
public interface IEnemiesController
{
/// <summary>
/// Load all enemies or enemies for a specific season
/// </summary>
/// <param name="parameter">An <see cref="GetEnemiesParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="GetEnemiesResponse"/></returns>
Task<ApiResponse<GetEnemiesResponse>> GetEnemies(GetEnemiesParameter parameter);
/// <summary>
/// Load detailed information on a single enemy
/// </summary>
/// <param name="parameter">An <see cref="GetEnemyParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="GetEnemyResponse"/></returns>
Task<ApiResponse<GetEnemyResponse>> GetEnemy(GetEnemyParameter parameter);
/// <summary>
/// Creates or updates an enemy object
/// </summary>
/// <param name="parameter">An <see cref="SaveEnemyParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="SaveEnemyResponse"/></returns>
Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter);
/// <summary>
/// Deletes an enemy object
/// </summary>
/// <param name="parameter">An <see cref="DeleteEnemyParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="DeleteEnemyResponse"/></returns>
Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter);
}
}

View File

@@ -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
/// <summary>
/// Parameter class for the GetEnemies API controller.
/// </summary>
public class GetEnemiesParameter : IApiParameter
{
/// <summary>
/// (Optional) Load enemies for this season
/// </summary>
public Guid SeasonId { get; set; }
public GetEnemiesParameter(Guid seasonId)
{
SeasonId = seasonId;
}
public GetEnemiesParameter()
{
SeasonId = Guid.Empty;
}
}
/// <summary>
/// Parameter class returned from the GetEnemies API controller.
/// </summary>
public class GetEnemiesResponse : IApiResponse
{
/// <summary>
/// The loaded enemies
/// </summary>
public List<Enemy> Enemies { get; set; }
public GetEnemiesResponse(List<Enemy> enemies)
{
Enemies = enemies;
}
public GetEnemiesResponse()
{
}
}
# endregion
# region GetEnemy
/// <summary>
/// Parameter class for the GetEnemy API controller.
/// </summary>
public class GetEnemyParameter : IApiParameter
{
/// <summary>
/// ID of the enemy to load
/// </summary>
public Guid EnemyId { get; set; }
public GetEnemyParameter(Guid enemyId)
{
EnemyId = enemyId;
}
public GetEnemyParameter()
{
}
}
/// <summary>
/// Parameter class returned from the GetEnemy API controller.
/// </summary>
public class GetEnemyResponse : IApiResponse
{
/// <summary>
/// A detailed Enemy object
/// </summary>
public Enemy Enemy { get; set; }
public GetEnemyResponse(Enemy enemy)
{
Enemy = enemy;
}
public GetEnemyResponse()
{
}
}
# endregion
# region SaveEnemy
/// <summary>
/// Parameter class for the SaveEnemy API controller.
/// </summary>
public class SaveEnemyParameter : IApiParameter
{
/// <summary>
/// The enemy object to create or update
/// </summary>
public Enemy Enemy { get; set; }
public SaveEnemyParameter(Enemy enemy)
{
Enemy = enemy;
}
public SaveEnemyParameter()
{
}
}
/// <summary>
/// Parameter class returned from the SaveEnemy API controller.
/// </summary>
public class SaveEnemyResponse : IApiResponse
{
/// <summary>
/// ID of the created or updated enemy object
/// </summary>
public Guid EnemyId { get; set; }
public SaveEnemyResponse(Guid enemyId)
{
EnemyId = enemyId;
}
public SaveEnemyResponse()
{
}
}
# endregion
# region DeleteEnemy
/// <summary>
/// Parameter class for the DeleteEnemy API controller.
/// </summary>
public class DeleteEnemyParameter : IApiParameter
{
/// <summary>
/// ID of the enemy to delete
/// </summary>
public Guid EnemyId { get; set; }
public DeleteEnemyParameter(Guid enemyId)
{
EnemyId = enemyId;
}
public DeleteEnemyParameter()
{
}
}
/// <summary>
/// Parameter class returned from the DeleteEnemy API controller.
/// </summary>
public class DeleteEnemyResponse : IApiResponse
{
public DeleteEnemyResponse()
{
}
}
# endregion
}