diff --git a/src/Server/StellarChat.Server.Api/Program.cs b/src/Server/StellarChat.Server.Api/Program.cs index 9e84d0b..8bcb26e 100644 --- a/src/Server/StellarChat.Server.Api/Program.cs +++ b/src/Server/StellarChat.Server.Api/Program.cs @@ -3,6 +3,7 @@ using StellarChat.Shared.Infrastructure.Observability.Logging; using StellarChat.Shared.Infrastructure.DAL.Mongo; using StellarChat.Shared.Infrastructure.API.CORS; +using StellarChat.Shared.Infrastructure.API.Endpoints; var builder = WebApplication.CreateBuilder(args); @@ -15,6 +16,7 @@ builder.Services.AddCorsPolicy(builder.Configuration); builder.Host.UseLogging(); builder.Services.AddMongo(builder.Configuration); +builder.Services.RegisterEndpoints(builder.Configuration); var app = builder.Build(); @@ -30,6 +32,8 @@ app.UseErrorHandling(); app.UseContext(); app.UseLogging(); +app.UseEndpoints(); +app.MapEndpoints(); var summaries = new[] { diff --git a/src/Shared/StellarChat.Shared.Abstractions/API/Endpoints/IEndpoint.cs b/src/Shared/StellarChat.Shared.Abstractions/API/Endpoints/IEndpoint.cs new file mode 100644 index 0000000..01a439f --- /dev/null +++ b/src/Shared/StellarChat.Shared.Abstractions/API/Endpoints/IEndpoint.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace StellarChat.Shared.Abstractions.API.Endpoints; + +public interface IEndpoint +{ + void Register(IServiceCollection services, IConfiguration configuration); + void Use(IApplicationBuilder app); + void Expose(IEndpointRouteBuilder endpoints); + + protected static IResult Select(TData data) + where TData : class + => data is null + ? Results.NotFound() + : Results.Ok(data); +} \ No newline at end of file diff --git a/src/Shared/StellarChat.Shared.Infrastructure/API/Endpoints/Extensions.cs b/src/Shared/StellarChat.Shared.Infrastructure/API/Endpoints/Extensions.cs new file mode 100644 index 0000000..88d9d1f --- /dev/null +++ b/src/Shared/StellarChat.Shared.Infrastructure/API/Endpoints/Extensions.cs @@ -0,0 +1,53 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using StellarChat.Shared.Abstractions.API.Endpoints; + +namespace StellarChat.Shared.Infrastructure.API.Endpoints; + +public static class Extensions +{ + private static readonly List registeredEndpoints = new(); + + public static IServiceCollection RegisterEndpoints(this IServiceCollection services, IConfiguration configuration) + { + var endpoints = DiscoverEndpoints(); + + foreach (var endpoint in endpoints) + { + endpoint.Register(services, configuration); + registeredEndpoints.Add(endpoint); + } + + return services; + } + + public static IApplicationBuilder UseEndpoints(this IApplicationBuilder app) + { + foreach (var endpoint in registeredEndpoints) + { + endpoint.Use(app); + } + + return app; + } + + public static WebApplication MapEndpoints(this WebApplication app) + { + foreach (var endpoint in registeredEndpoints) + { + endpoint.Expose(app); + } + + return app; + } + + private static IList DiscoverEndpoints() + => AppDomain.CurrentDomain + .GetAssemblies() + .SelectMany(x => x.GetTypes()) + .Where(p => p.IsClass && p.IsAssignableTo(typeof(IEndpoint))) + .Select(Activator.CreateInstance) + .Cast() + .ToList(); +}