using StellaOps.Router.Gateway.Middleware; using StellaOps.Router.Gateway.OpenApi; using StellaOps.Router.Gateway.RateLimit; namespace StellaOps.Router.Gateway; /// /// Extension methods for configuring the router gateway middleware pipeline. /// public static class ApplicationBuilderExtensions { /// /// Adds the router gateway middleware pipeline. /// /// The application builder. /// The application builder for chaining. public static IApplicationBuilder UseRouterGateway(this IApplicationBuilder app) { // Request logging and error handling wrap the full router pipeline. app.UseMiddleware(); app.UseMiddleware(); // Enforce payload limits first app.UseMiddleware(); // Resolve endpoints from routing state app.UseMiddleware(); // Rate limiting (Sprint 1200_001_001) // Runs after endpoint resolution so microservice identity is available. app.UseRateLimiting(); // Make routing decisions (select instance) app.UseMiddleware(); // Dispatch to transport and return response app.UseMiddleware(); return app; } /// /// Adds rate limiting middleware to the pipeline. /// Sprint: SPRINT_1200_001_001_router_rate_limiting_core /// Task: 1.6 - Wire into Router Pipeline /// /// The application builder. /// The application builder for chaining. public static IApplicationBuilder UseRateLimiting(this IApplicationBuilder app) { // Only add if rate limit service is registered var rateLimitService = app.ApplicationServices.GetService(); if (rateLimitService is not null) { app.UseMiddleware(); } return app; } /// /// Adds the router gateway middleware pipeline without payload limiting. /// /// The application builder. /// The application builder for chaining. public static IApplicationBuilder UseRouterGatewayCore(this IApplicationBuilder app) { // Request logging and error handling wrap the full router pipeline. app.UseMiddleware(); app.UseMiddleware(); // Resolve endpoints from routing state app.UseMiddleware(); // Rate limiting (Sprint 1200_001_001) // Runs after endpoint resolution so microservice identity is available. app.UseRateLimiting(); // Make routing decisions (select instance) app.UseMiddleware(); // Dispatch to transport and return response app.UseMiddleware(); return app; } /// /// Maps OpenAPI endpoints to the application. /// Should be called before UseRouterGateway so OpenAPI requests are handled first. /// /// The endpoint route builder. /// The endpoint route builder for chaining. public static IEndpointRouteBuilder MapRouterOpenApi(this IEndpointRouteBuilder endpoints) { return endpoints.MapRouterOpenApiEndpoints(); } }