From ab8937f7cd7e2e3d3d3c3818ee900e2cf1a25955 Mon Sep 17 00:00:00 2001 From: littlefoot Date: Mon, 25 Oct 2021 16:10:41 -0400 Subject: [PATCH] More changes to the endpoint auto setup --- .../Controllers/MethodBasedController.cs | 54 +++++++++++++++++++ .../Controllers/PlayerDataController.cs | 39 ++++---------- TOOHUCardAPI/Models/IMethodBasedRequest.cs | 11 ++++ TOOHUCardAPI/TOOHUCardAPI.csproj | 4 -- 4 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 TOOHUCardAPI/Controllers/MethodBasedController.cs create mode 100644 TOOHUCardAPI/Models/IMethodBasedRequest.cs diff --git a/TOOHUCardAPI/Controllers/MethodBasedController.cs b/TOOHUCardAPI/Controllers/MethodBasedController.cs new file mode 100644 index 0000000..ec6e67a --- /dev/null +++ b/TOOHUCardAPI/Controllers/MethodBasedController.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using TOOHUCardAPI.Data; + +using MethodMap = System.Collections.Generic.Dictionary; +namespace TOOHUCardAPI.Controllers +{ + public class MethodBasedController : ControllerBase + { + public delegate Task EndpointHandler(string requestBody); + private static Dictionary MethodMapByType; + + protected Task InvokeEndpointHandlerForMethod(object _this, string method, string body) + { + MethodMap registeredEndpointHandlers = GetMethodMapForType(); + if (registeredEndpointHandlers.ContainsKey(method)) + { + return ((EndpointHandler) registeredEndpointHandlers[method] + .CreateDelegate(typeof(EndpointHandler), _this)).Invoke(body); + } + throw new MissingEndpointHandlerException(method); + } + + private MethodMap GetMethodMapForType() + { + if (!MethodMapByType.ContainsKey(typeof(T))) + { + RegisterEndpointHandlers(); + } + + return MethodMapByType[typeof(T)]; + } + + private static MethodMap RegisterEndpointHandlers() + { + MethodInfo[] methods = typeof(T).GetMethods(); + return methods + .Aggregate(new MethodMap(), (handlers, m) => + { + Attribute attr = m.GetCustomAttribute(typeof(EndpointHandlerAttribute), false); + if (attr != null) + { + EndpointHandlerAttribute e = (EndpointHandlerAttribute) attr; + handlers.Add(e.Method, m); + } + return handlers; + }); + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Controllers/PlayerDataController.cs b/TOOHUCardAPI/Controllers/PlayerDataController.cs index f7ee7ad..8986c0a 100644 --- a/TOOHUCardAPI/Controllers/PlayerDataController.cs +++ b/TOOHUCardAPI/Controllers/PlayerDataController.cs @@ -6,50 +6,31 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using TOOHUCardAPI.Data; +using TOOHUCardAPI.Models; namespace TOOHUCardAPI.Controllers { [Route("api/[controller]")] [ApiController] - public class PlayerDataController : ControllerBase + public class PlayerDataController : MethodBasedController { - private delegate Task EndpointHandler(string requestBody); - // Mapping of method => handler - private Dictionary registeredEndpointHandlers; - - private void RegisterEndpointHandlers() - { - MethodInfo[] methods = typeof(PlayerDataController).GetMethods(); - registeredEndpointHandlers = methods - .Aggregate(new Dictionary(), (handlers, m) => - { - Attribute attr = m.GetCustomAttribute(typeof(EndpointHandlerAttribute), false); - if (attr != null) - { - EndpointHandlerAttribute e = (EndpointHandlerAttribute) attr; - handlers.Add(e.Method, (EndpointHandler)m.CreateDelegate(typeof(EndpointHandler), this)); - } - return handlers; - }); - } - - public PlayerDataController() - { - RegisterEndpointHandlers(); - - } - /** * The game uses a single endpoint for player data. * The object they send has a method field that's used to decide what's being done * So let's use a single entry point and redirect based on that */ [HttpPost] - public async Task EntryPoint() + public async Task EntryPoint(IMethodBasedRequest methodRequest) { - return null; } } + + public class MissingEndpointHandlerException : Exception + { + public MissingEndpointHandlerException(string? method) : base($"Handler for [{method}] is either missing or incorrectly setup.") + { + } + } } \ No newline at end of file diff --git a/TOOHUCardAPI/Models/IMethodBasedRequest.cs b/TOOHUCardAPI/Models/IMethodBasedRequest.cs new file mode 100644 index 0000000..1ec22f5 --- /dev/null +++ b/TOOHUCardAPI/Models/IMethodBasedRequest.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; +using Newtonsoft.Json; + +namespace TOOHUCardAPI.Models +{ + public interface IMethodBasedRequest + { + [JsonPropertyName("method")] + public string Method { get; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/TOOHUCardAPI.csproj b/TOOHUCardAPI/TOOHUCardAPI.csproj index 8cc6b92..76e4201 100644 --- a/TOOHUCardAPI/TOOHUCardAPI.csproj +++ b/TOOHUCardAPI/TOOHUCardAPI.csproj @@ -10,8 +10,4 @@ - - - -