FeatureGateExtensions.cs 958 B

123456789101112131415161718192021222324252627
  1. using Microsoft.Extensions.Options;
  2. using SharedKernel;
  3. namespace Web.Api.Extensions;
  4. /// <summary>
  5. /// appsettings Features 섹션 기반 엔드포인트 게이트.
  6. /// 플래그가 꺼져 있으면 매핑된 라우트가 404(NotFound)를 반환한다 — 라우트/핸들러 코드는 보존.
  7. /// 사용: <c>.RequireFeature(c => c.Channel)</c>
  8. /// </summary>
  9. public static class FeatureGateExtensions
  10. {
  11. public static TBuilder RequireFeature<TBuilder>(this TBuilder builder, Func<AppSettings.FeaturesSection, bool> feature) where TBuilder : IEndpointConventionBuilder
  12. {
  13. builder.AddEndpointFilter(async (context, next) => {
  14. var settings = context.HttpContext.RequestServices.GetRequiredService<IOptions<AppSettings>>().Value;
  15. if (!feature(settings.Features))
  16. {
  17. return Results.NotFound();
  18. }
  19. return await next(context);
  20. });
  21. return builder;
  22. }
  23. }