Add code generation.

Replaces the client and server controller implementations with generated code from the shared project.
This commit is contained in:
2020-03-13 20:16:53 +01:00
parent 7bd44091cf
commit 42bca48742
29 changed files with 542 additions and 499 deletions

View File

@@ -12,4 +12,17 @@
<PackageReference Include="Z.ExtensionMethods" Version="2.1.1" />
</ItemGroup>
<ItemGroup>
<None Update="Routes.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>Routes.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Compile Update="Routes.cs">
<DependentUpon>Routes.tt</DependentUpon>
</Compile>
</ItemGroup>
</Project>

View File

@@ -3,14 +3,12 @@ using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using EstusShots.Client.Routes;
using EstusShots.Shared.Dto;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
namespace EstusShots.Client
{
public class EstusShotsClient
public partial class EstusShotsClient
{
private readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions
{
@@ -20,13 +18,6 @@ namespace EstusShots.Client
public string ApiUrl { get; }
// API Routes
public Seasons Seasons { get; }
public Episodes Episodes { get; }
public Players Players { get; }
public Drinks Drinks { get; }
public Enemies Enemies { get; }
/// <summary>
/// Creates a new instance of <see cref="EstusShotsClient"/>
/// </summary>
@@ -35,12 +26,7 @@ namespace EstusShots.Client
{
ApiUrl = apiUrl;
HttpClient = new HttpClient {Timeout = TimeSpan.FromSeconds(10)};
Seasons = new Seasons(this);
Episodes = new Episodes(this);
Players = new Players(this);
Drinks = new Drinks(this);
Enemies = new Enemies(this);
CreateApiRoutes();
}
/// <summary>

141
EstusShots.Client/Routes.cs Normal file
View File

@@ -0,0 +1,141 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using EstusShots.Shared.Interfaces.Controllers;
namespace EstusShots.Client
{
// Generated part of the client class
public partial class EstusShotsClient
{
public Drinks Drinks { get; internal set; }
public Enemies Enemies { get; internal set; }
public Episodes Episodes { get; internal set; }
public Players Players { get; internal set; }
public Seasons Seasons { get; internal set; }
private void CreateApiRoutes()
{
Drinks = new Drinks(this);
Enemies = new Enemies(this);
Episodes = new Episodes(this);
Players = new Players(this);
Seasons = new Seasons(this);
}
}
public class Drinks : IDrinksController
{
private readonly EstusShotsClient _client;
public Drinks(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetDrinksResponse>> GetDrinks(GetDrinksParameter parameter)
=> await _client.PostToApi<GetDrinksResponse, GetDrinksParameter>($"{_client.ApiUrl}Drinks/GetDrinks", parameter);
public async Task<ApiResponse<GetDrinkDetailsResponse>> GetDrinkDetails(GetDrinkDetailsParameter parameter)
=> await _client.PostToApi<GetDrinkDetailsResponse, GetDrinkDetailsParameter>($"{_client.ApiUrl}Drinks/GetDrinkDetails", parameter);
public async Task<ApiResponse<SaveDrinkResponse>> SaveDrink(SaveDrinkParameter parameter)
=> await _client.PostToApi<SaveDrinkResponse, SaveDrinkParameter>($"{_client.ApiUrl}Drinks/SaveDrink", parameter);
}
public class Enemies : IEnemiesController
{
private readonly EstusShotsClient _client;
public Enemies(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetEnemiesResponse>> GetEnemies(GetEnemiesParameter parameter)
=> await _client.PostToApi<GetEnemiesResponse, GetEnemiesParameter>($"{_client.ApiUrl}Enemies/GetEnemies", parameter);
public async Task<ApiResponse<GetEnemyResponse>> GetEnemy(GetEnemyParameter parameter)
=> await _client.PostToApi<GetEnemyResponse, GetEnemyParameter>($"{_client.ApiUrl}Enemies/GetEnemy", parameter);
public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
=> await _client.PostToApi<SaveEnemyResponse, SaveEnemyParameter>($"{_client.ApiUrl}Enemies/SaveEnemy", parameter);
public async Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter)
=> await _client.PostToApi<DeleteEnemyResponse, DeleteEnemyParameter>($"{_client.ApiUrl}Enemies/DeleteEnemy", parameter);
}
public class Episodes : IEpisodesController
{
private readonly EstusShotsClient _client;
public Episodes(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetEpisodesResponse>> GetEpisodes(GetEpisodesParameter parameter)
=> await _client.PostToApi<GetEpisodesResponse, GetEpisodesParameter>($"{_client.ApiUrl}Episodes/GetEpisodes", parameter);
public async Task<ApiResponse<GetEpisodeResponse>> GetEpisode(GetEpisodeParameter parameter)
=> await _client.PostToApi<GetEpisodeResponse, GetEpisodeParameter>($"{_client.ApiUrl}Episodes/GetEpisode", parameter);
public async Task<ApiResponse<SaveEpisodeResponse>> SaveEpisode(SaveEpisodeParameter parameter)
=> await _client.PostToApi<SaveEpisodeResponse, SaveEpisodeParameter>($"{_client.ApiUrl}Episodes/SaveEpisode", parameter);
}
public class Players : IPlayersController
{
private readonly EstusShotsClient _client;
public Players(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter)
=> await _client.PostToApi<GetPlayersResponse, GetPlayersParameter>($"{_client.ApiUrl}Players/GetPlayers", parameter);
public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter)
=> await _client.PostToApi<GetPlayerDetailsResponse, GetPlayerDetailsParameter>($"{_client.ApiUrl}Players/GetPlayerDetails", parameter);
public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter)
=> await _client.PostToApi<SavePlayerResponse, SavePlayerParameter>($"{_client.ApiUrl}Players/SavePlayer", parameter);
public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayer(DeletePlayerParameter parameter)
=> await _client.PostToApi<DeletePlayerResponse, DeletePlayerParameter>($"{_client.ApiUrl}Players/DeletePlayer", parameter);
}
public class Seasons : ISeasonsController
{
private readonly EstusShotsClient _client;
public Seasons(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetSeasonsResponse>> GetSeasons(GetSeasonsParameter parameter)
=> await _client.PostToApi<GetSeasonsResponse, GetSeasonsParameter>($"{_client.ApiUrl}Seasons/GetSeasons", parameter);
public async Task<ApiResponse<GetSeasonResponse>> GetSeason(GetSeasonParameter parameter)
=> await _client.PostToApi<GetSeasonResponse, GetSeasonParameter>($"{_client.ApiUrl}Seasons/GetSeason", parameter);
public async Task<ApiResponse<SaveSeasonResponse>> SaveSeason(SaveSeasonParameter parameter)
=> await _client.PostToApi<SaveSeasonResponse, SaveSeasonParameter>($"{_client.ApiUrl}Seasons/SaveSeason", parameter);
}
}

View File

@@ -0,0 +1,91 @@
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)EstusShots.Shared/bin/Debug/netcoreapp3.1/EstusShots.Shared.dll" #>
<#@ import namespace="Shared.Interfaces" #>
<#@ import namespace="System.Linq" #>
<#
var assembly = typeof(IApiParameter).Assembly;
var types = assembly.GetTypes()
.Where(t => t.Namespace?.StartsWith("EstusShots.Shared") == true)
.ToArray();
var controllers = types
.Where(t => t.Namespace == "EstusShots.Shared.Interfaces.Controllers")
.ToArray();
#>
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using EstusShots.Shared.Interfaces.Controllers;
namespace EstusShots.Client
{
// Generated part of the client class
public partial class EstusShotsClient
{
<#
// Create API client route properties
foreach (var iFace in controllers)
{
var className = iFace.Name.Substring(1).Replace("Controller", "");
#>
public <#=className#> <#=className#> { get; internal set; }
<#
}
#>
private void CreateApiRoutes()
{
<#
// Instantiate API client routes
foreach (var iFace in controllers)
{
var className = iFace.Name.Substring(1).Replace("Controller", "");
#>
<#=className#> = new <#=className#>(this);
<#
}
#>
}
}
<#
foreach (var iFace in controllers)
{
var className = iFace.Name.Substring(1).Replace("Controller", "");
#>
public class <#=className#> : <#=iFace.Name #>
{
private readonly EstusShotsClient _client;
public <#=className#>(EstusShotsClient client)
{
_client = client;
}
<#
foreach (var member in iFace.GetMembers())
{
var responseName = $"{member.Name}Response";
var parameterName = $"{member.Name}Parameter";
#>
public async Task<ApiResponse<<#=responseName#>>> <#=member.Name#>(<#=parameterName#> parameter)
=> await _client.PostToApi<<#=responseName#>, <#=parameterName#>>($"{_client.ApiUrl}<#=className#>/<#=member.Name#>", parameter);
<#
}
#>
}
<#
}
#>
}

View File

@@ -1,34 +0,0 @@
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Client.Routes
{
/// <inheritdoc/>
public class Drinks : IDrinksController
{
private readonly EstusShotsClient _client;
public Drinks(EstusShotsClient client)
{
_client = client;
}
private string ActionUrl([CallerMemberName]string caller = "") =>
$"{_client.ApiUrl}{GetType().Name}/{caller}";
/// <inheritdoc/>
public async Task<ApiResponse<GetDrinksResponse>> GetDrinks(GetDrinksParameter parameter)
=> await _client.PostToApi<GetDrinksResponse, GetDrinksParameter>(ActionUrl(), parameter);
/// <inheritdoc/>
public async Task<ApiResponse<GetDrinkDetailsResponse>> GetDrinkDetails(GetDrinkDetailsParameter parameter)
=> await _client.PostToApi<GetDrinkDetailsResponse, GetDrinkDetailsParameter>(ActionUrl(), parameter);
/// <inheritdoc/>
public async Task<ApiResponse<SaveDrinkResponse>> SaveDrink(SaveDrinkParameter parameter)
=> await _client.PostToApi<SaveDrinkResponse, SaveDrinkParameter>(ActionUrl(), parameter);
}
}

View File

@@ -1,33 +0,0 @@
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Client.Routes
{
public class Enemies : IEnemiesController
{
private readonly EstusShotsClient _client;
public Enemies(EstusShotsClient client)
{
_client = client;
}
public async Task<ApiResponse<GetEnemiesResponse>> GetEnemies(GetEnemiesParameter parameter)
=> await _client.PostToApi<GetEnemiesResponse, GetEnemiesParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<GetEnemyResponse>> GetEnemy(GetEnemyParameter parameter)
=> await _client.PostToApi<GetEnemyResponse, GetEnemyParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
=> await _client.PostToApi<SaveEnemyResponse, SaveEnemyParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter)
=> await _client.PostToApi<DeleteEnemyResponse, DeleteEnemyParameter>(ActionUrl(), parameter);
private string ActionUrl([CallerMemberName]string caller = "") =>
$"{_client.ApiUrl}{GetType().Name}/{caller}";
}
}

View File

@@ -1,30 +0,0 @@
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Client.Routes
{
public class Episodes : IEpisodesController
{
private readonly EstusShotsClient _client;
public Episodes(EstusShotsClient client)
{
_client = client;
}
private string ActionUrl([CallerMemberName]string caller = "") =>
$"{_client.ApiUrl}{nameof(Episodes)}/{caller}";
public async Task<ApiResponse<GetEpisodesResponse>> GetEpisodes(GetEpisodesParameter parameter) =>
await _client.PostToApi<GetEpisodesResponse, GetEpisodesParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<GetEpisodeResponse>> GetEpisode(GetEpisodeParameter parameter) =>
await _client.PostToApi<GetEpisodeResponse, GetEpisodeParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<SaveEpisodeResponse>> SaveEpisode(SaveEpisodeParameter parameter) =>
await _client.PostToApi<SaveEpisodeResponse, SaveEpisodeParameter>(ActionUrl(), parameter);
}
}

View File

@@ -1,32 +0,0 @@
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Client.Routes
{
public class Players : IPlayersController
{
private readonly EstusShotsClient _client;
public Players(EstusShotsClient client)
{
_client = client;
}
private string ActionUrl([CallerMemberName]string caller = "") =>
$"{_client.ApiUrl}{GetType().Name}/{caller}";
public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter)
=> await _client.PostToApi<GetPlayersResponse, GetPlayersParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter)
=> await _client.PostToApi<GetPlayerDetailsResponse, GetPlayerDetailsParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter)
=> await _client.PostToApi<SavePlayerResponse, SavePlayerParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter)
=> await _client.PostToApi<DeletePlayerResponse, DeletePlayerParameter>(ActionUrl(), parameter);
}
}

View File

@@ -1,30 +0,0 @@
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Client.Routes
{
public class Seasons : ISeasonsController
{
private readonly EstusShotsClient _client;
public Seasons(EstusShotsClient client)
{
_client = client;
}
private string ActionUrl([CallerMemberName]string caller = "") =>
$"{_client.ApiUrl}{nameof(Seasons)}/{caller}";
public async Task<ApiResponse<GetSeasonsResponse>> GetSeasons(GetSeasonsParameter parameter) =>
await _client.PostToApi<GetSeasonsResponse, GetSeasonsParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<GetSeasonResponse>> GetSeason(GetSeasonParameter parameter) =>
await _client.PostToApi<GetSeasonResponse, GetSeasonParameter>(ActionUrl(), parameter);
public async Task<ApiResponse<SaveSeasonResponse>> SaveSeason(SaveSeasonParameter parameter)=>
await _client.PostToApi<SaveSeasonResponse, SaveSeasonParameter>(ActionUrl(), parameter);
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using EstusShots.Client;
using EstusShots.Gtk.Dialogs;
using Gdk;

View File

@@ -0,0 +1,45 @@
using System;
using System.Threading.Tasks;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace EstusShots.Server.Controllers
{
/// <summary>
/// Base class for all API controllers.
/// Contains shared methods and properties that get used by the generated code.
/// </summary>
public abstract class BaseController : ControllerBase
{
private readonly ILogger _logger;
protected BaseController(ILogger logger)
{
_logger = logger;
}
/// <summary>
/// Generic method to handle the boilerplate code when calling an api service.
/// </summary>
/// <param name="serviceCall">Function that calls an API service</param>
/// <typeparam name="T">A response parameter that implements <see cref="IApiResponse"/></typeparam>
/// <returns>An <see cref="ApiResponse{T}"/></returns>
protected 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

@@ -0,0 +1,152 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using EstusShots.Server.Services;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using EstusShots.Shared.Interfaces.Controllers;
namespace EstusShots.Server.Controllers
{
[ApiController]
[Route("/api/[controller]/[action]")]
public class DrinksController : BaseController, IDrinksController
{
private readonly DrinksService _service;
public DrinksController(ILogger<DrinksController> logger, DrinksService service) : base(logger)
{
_service = service;
}
[HttpPost]
public async Task<ApiResponse<GetDrinksResponse>> GetDrinks(GetDrinksParameter parameter)
=> await ServiceCall(() => _service.GetDrinks(parameter));
[HttpPost]
public async Task<ApiResponse<GetDrinkDetailsResponse>> GetDrinkDetails(GetDrinkDetailsParameter parameter)
=> await ServiceCall(() => _service.GetDrinkDetails(parameter));
[HttpPost]
public async Task<ApiResponse<SaveDrinkResponse>> SaveDrink(SaveDrinkParameter parameter)
=> await ServiceCall(() => _service.SaveDrink(parameter));
}
[ApiController]
[Route("/api/[controller]/[action]")]
public class EnemiesController : BaseController, IEnemiesController
{
private readonly EnemiesService _service;
public EnemiesController(ILogger<EnemiesController> logger, EnemiesService service) : base(logger)
{
_service = service;
}
[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));
}
[ApiController]
[Route("/api/[controller]/[action]")]
public class EpisodesController : BaseController, IEpisodesController
{
private readonly EpisodesService _service;
public EpisodesController(ILogger<EpisodesController> logger, EpisodesService service) : base(logger)
{
_service = service;
}
[HttpPost]
public async Task<ApiResponse<GetEpisodesResponse>> GetEpisodes(GetEpisodesParameter parameter)
=> await ServiceCall(() => _service.GetEpisodes(parameter));
[HttpPost]
public async Task<ApiResponse<GetEpisodeResponse>> GetEpisode(GetEpisodeParameter parameter)
=> await ServiceCall(() => _service.GetEpisode(parameter));
[HttpPost]
public async Task<ApiResponse<SaveEpisodeResponse>> SaveEpisode(SaveEpisodeParameter parameter)
=> await ServiceCall(() => _service.SaveEpisode(parameter));
}
[ApiController]
[Route("/api/[controller]/[action]")]
public class PlayersController : BaseController, IPlayersController
{
private readonly PlayersService _service;
public PlayersController(ILogger<PlayersController> logger, PlayersService service) : base(logger)
{
_service = service;
}
[HttpPost]
public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter)
=> await ServiceCall(() => _service.GetPlayers(parameter));
[HttpPost]
public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter)
=> await ServiceCall(() => _service.GetPlayerDetails(parameter));
[HttpPost]
public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter)
=> await ServiceCall(() => _service.SavePlayer(parameter));
[HttpPost]
public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayer(DeletePlayerParameter parameter)
=> await ServiceCall(() => _service.DeletePlayer(parameter));
}
[ApiController]
[Route("/api/[controller]/[action]")]
public class SeasonsController : BaseController, ISeasonsController
{
private readonly SeasonsService _service;
public SeasonsController(ILogger<SeasonsController> logger, SeasonsService service) : base(logger)
{
_service = service;
}
[HttpPost]
public async Task<ApiResponse<GetSeasonsResponse>> GetSeasons(GetSeasonsParameter parameter)
=> await ServiceCall(() => _service.GetSeasons(parameter));
[HttpPost]
public async Task<ApiResponse<GetSeasonResponse>> GetSeason(GetSeasonParameter parameter)
=> await ServiceCall(() => _service.GetSeason(parameter));
[HttpPost]
public async Task<ApiResponse<SaveSeasonResponse>> SaveSeason(SaveSeasonParameter parameter)
=> await ServiceCall(() => _service.SaveSeason(parameter));
}
}

View File

@@ -0,0 +1,71 @@
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)EstusShots.Shared/bin/Debug/netcoreapp3.1/EstusShots.Shared.dll" #>
<#@ import namespace="Shared.Interfaces" #>
<#@ import namespace="System.Linq" #>
<#
var assembly = typeof(IApiParameter).Assembly;
var types = assembly.GetTypes()
.Where(t => t.Namespace?.StartsWith("EstusShots.Shared") == true)
.ToArray();
var controllers = types
.Where(t => t.Namespace == "EstusShots.Shared.Interfaces.Controllers")
.ToArray();
#>
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using EstusShots.Server.Services;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using EstusShots.Shared.Interfaces.Controllers;
namespace EstusShots.Server.Controllers
{
<#
// The Controllers
foreach (var iFace in controllers)
{
var controllerName = iFace.Name.Substring(1);
var routeName = iFace.Name.Substring(1).Replace("Controller", "");
#>
[ApiController]
[Route("/api/[controller]/[action]")]
public class <#=controllerName#> : BaseController, <#=iFace.Name #>
{
private readonly <#=routeName#>Service _service;
public <#=controllerName#>(ILogger<<#=controllerName#>> logger, <#=routeName#>Service service) : base(logger)
{
_service = service;
}
<#
// The Interface Members
foreach (var member in iFace.GetMembers())
{
var responseName = $"{member.Name}Response";
var parameterName = $"{member.Name}Parameter";
#>
[HttpPost]
public async Task<ApiResponse<<#=responseName#>>> <#=member.Name#>(<#=parameterName#> parameter)
=> await ServiceCall(() => _service.<#=member.Name#>(parameter));
<#
}
#>
}
<#
}
#>
}

View File

@@ -1,54 +0,0 @@
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 DrinksController : ControllerBase, IDrinksController
{
private readonly ILogger _logger;
private readonly DrinksService _service;
public DrinksController(ILogger<DrinksController> logger, DrinksService drinksService)
{
_logger = logger;
_service = drinksService;
}
[HttpPost]
public async Task<ApiResponse<GetDrinksResponse>> GetDrinks(GetDrinksParameter parameter)
=> await ServiceCall(() => _service.GetDrinks(parameter));
[HttpPost]
public async Task<ApiResponse<GetDrinkDetailsResponse>> GetDrinkDetails(GetDrinkDetailsParameter parameter)
=> await ServiceCall(() => _service.GetDrinkDetails(parameter));
[HttpPost]
public async Task<ApiResponse<SaveDrinkResponse>> SaveDrink(SaveDrinkParameter parameter)
=> await ServiceCall(() => _service.SaveDrink(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

@@ -1,58 +0,0 @@
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

@@ -1,70 +0,0 @@
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 EpisodesController : ControllerBase, IEpisodesController
{
private readonly ILogger _logger;
private readonly EpisodesService _episodesService;
public EpisodesController(ILogger<EpisodesController> logger, EpisodesService episodesService)
{
_logger = logger;
_episodesService = episodesService;
}
[HttpPost]
public async Task<ApiResponse<GetEpisodesResponse>> GetEpisodes(GetEpisodesParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _episodesService.GetEpisodes(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<GetEpisodesResponse>(new OperationResult(e));
}
}
[HttpPost]
public async Task<ApiResponse<GetEpisodeResponse>> GetEpisode(GetEpisodeParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _episodesService.GetEpisode(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<GetEpisodeResponse>(new OperationResult(e));
}
}
[HttpPost]
public async Task<ApiResponse<SaveEpisodeResponse>> SaveEpisode(SaveEpisodeParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _episodesService.SaveEpisode(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<SaveEpisodeResponse>(new OperationResult(e));
}
}
}
}

View File

@@ -1,61 +0,0 @@
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 PlayersController : ControllerBase, IPlayersController
{
private readonly ILogger _logger;
private readonly PlayersService _service;
public PlayersController(ILogger<PlayersController> logger, PlayersService service)
{
_logger = logger;
_service = service;
}
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));
}
}
[HttpPost]
public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter)
=> await ServiceCall(() => _service.GetPlayers(parameter));
[HttpPost]
public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter)
=> await ServiceCall(() => _service.GetPlayerDetails(parameter));
[HttpPost]
public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter)
=> await ServiceCall(() => _service.SavePlayer(parameter));
[HttpPost]
public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter)
=> await ServiceCall(() => _service.DeletePlayers(parameter));
}
}

View File

@@ -1,71 +0,0 @@
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 SeasonsController : ControllerBase, ISeasonsController
{
private readonly ILogger _logger;
private readonly SeasonsService _seasonsService;
public SeasonsController(ILogger<SeasonsController> logger, SeasonsService seasonsService)
{
_seasonsService = seasonsService;
_logger = logger;
}
[HttpPost]
public async Task<ApiResponse<GetSeasonsResponse>> GetSeasons(GetSeasonsParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _seasonsService.GetSeasons(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<GetSeasonsResponse>(new OperationResult(e));
}
}
[HttpPost]
public async Task<ApiResponse<GetSeasonResponse>> GetSeason(GetSeasonParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _seasonsService.GetSeason(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<GetSeasonResponse>(new OperationResult(e));
}
}
[HttpPost]
public async Task<ApiResponse<SaveSeasonResponse>> SaveSeason(SaveSeasonParameter parameter)
{
try
{
_logger.LogInformation($"Request received from client '{Request.HttpContext.Connection.RemoteIpAddress}'");
return await _seasonsService.SaveSeason(parameter);
}
catch (Exception e)
{
_logger.LogError(e, "Exception Occured");
return new ApiResponse<SaveSeasonResponse>(new OperationResult(e));
}
}
}
}

View File

@@ -26,4 +26,17 @@
<ItemGroup>
<ProjectReference Include="..\EstusShots.Shared\EstusShots.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Controllers\Controllers.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>Controllers.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Compile Update="Controllers\Controllers.cs">
<DependentUpon>Controllers.tt</DependentUpon>
</Compile>
</ItemGroup>
</Project>

View File

@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using AutoMapper;
using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Interfaces.Controllers;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;

View File

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using AutoMapper;
using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Interfaces.Controllers;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using AutoMapper;
using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Interfaces.Controllers;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;

View File

@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using AutoMapper;
using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Interfaces.Controllers;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;
@@ -65,7 +66,7 @@ namespace EstusShots.Server.Services
}
}
public Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter)
public Task<ApiResponse<DeletePlayerResponse>> DeletePlayer(DeletePlayerParameter parameter)
{
throw new System.NotImplementedException();
}

View File

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using AutoMapper;
using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Interfaces.Controllers;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;

View File

@@ -2,7 +2,7 @@ using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
namespace EstusShots.Shared.Interfaces.Controllers
{
public interface IDrinksController
{

View File

@@ -2,7 +2,7 @@ using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
namespace EstusShots.Shared.Interfaces.Controllers
{
/// <summary>
/// Load and manipulate Enemy objects

View File

@@ -2,7 +2,7 @@ using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
namespace EstusShots.Shared.Interfaces.Controllers
{
/// <summary>
/// Access to episodes

View File

@@ -2,7 +2,7 @@ using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
namespace EstusShots.Shared.Interfaces.Controllers
{
/// <summary>
/// Load and manipulate player objects
@@ -33,8 +33,8 @@ namespace EstusShots.Shared.Interfaces
/// <summary>
/// Deletes a player
/// </summary>
/// <param name="parameter">An <see cref="DeletePlayerParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="DeletePlayerResponse"/></returns>
Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter);
/// <param name="parameter">An <see cref="DeletePlayersParameter"/> instance</param>
/// <returns>An ApiResponse instance of type <see cref="DeletePlayersResponse"/></returns>
Task<ApiResponse<DeletePlayerResponse>> DeletePlayer(DeletePlayerParameter parameter);
}
}

View File

@@ -2,7 +2,7 @@ using System.Threading.Tasks;
using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters;
namespace EstusShots.Shared.Interfaces
namespace EstusShots.Shared.Interfaces.Controllers
{
/// <summary>
/// Access many seasons with one request