1

I am using NSwag to generate code documentation, but would like to be able to have custom control over which order the endpoints appear on the generated swagger endpoint. Possibly via an attribute on the controller methods.

I can't see any way to achieve this. A few other posts mention alphanumeric ordering, but I need to be able to define a custom ordering. Is there any way to do this?

My SwaggerConfig

public class SwaggerApiConfig
  {
    public Assembly TargetWebAssembly { get; }

    public Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> ConfigureUiSettings { get; }

    public SwaggerApiConfig(
      string uiRoute,
      Assembly targetWebAssembly,
      string apiName,
      string description,
      string team = null,
      string appDocumentationUrl = null)
    {
      if (!uiRoute.StartsWith("/"))
        uiRoute = string.Format("/{0}", (object) uiRoute);
      this.TargetWebAssembly = targetWebAssembly;
      this.ConfigureUiSettings = SwaggerApiConfig.BuildSwaggerUiSettings(uiRoute, this.TargetWebAssembly, apiName, description, team, appDocumentationUrl);
    }

    public SwaggerApiConfig(
      Assembly targetWebAssembly,
      Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> configureUiSettings)
    {
      this.TargetWebAssembly = targetWebAssembly;
      this.ConfigureUiSettings = configureUiSettings;
    }

    public static Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>> BuildSwaggerUiSettings(
      string uiRoute,
      Assembly targetWebAssembly,
      string apiName,
      string description,
      string team = null,
      string appDocumentationUrl = null)
    {
      if (!uiRoute.StartsWith("/"))
        uiRoute = string.Format("/{0}", (object) uiRoute);
      return (Action<SwaggerUi3Settings<WebApiToSwaggerGeneratorSettings>>) (settings =>
      {
        settings.SwaggerUiRoute = uiRoute;
        settings.SwaggerRoute = string.Format("{0}/swagger.json", (object) uiRoute);
        settings.DocExpansion = "list";
        settings.GeneratorSettings.Title = apiName;
        settings.GeneratorSettings.Version = string.Format("{0}", (object) targetWebAssembly.GetName().Version);
        settings.GeneratorSettings.Description = description;
        settings.GeneratorSettings.IgnoreObsoleteProperties = false;
        settings.GeneratorSettings.GenerateKnownTypes = true;
        settings.GeneratorSettings.GenerateAbstractProperties = true;
        settings.GeneratorSettings.DefaultEnumHandling = EnumHandling.String;
        settings.GeneratorSettings.OperationProcessors.Add((IOperationProcessor) new CallerHeaderOperationProcessor());
        
        settings.PostProcess = (Action<SwaggerDocument>) (x =>
        {
          x.Security = (ICollection<SwaggerSecurityRequirement>) new List<SwaggerSecurityRequirement>();
          x.Info.Contact = new SwaggerContact()
          {
            Name = team,
            Url = appDocumentationUrl
          };
        });
      });
    }

How it then gets applied in my application plumbing

 if (swaggerApiOptions != null)
                {
                    foreach (var swaggerApiConfig in swaggerApiOptions.Configurations)
                    {
                        appBuilder.UseSwaggerUi3(swaggerApiConfig.TargetWebAssembly, swaggerApiConfig.ConfigureUiSettings);
                    }
                }
NZJames
  • 4,963
  • 15
  • 50
  • 100
  • Maybe check https://github.com/RicoSuter/NSwag/issues/2879): > * RicoSuter: You could try to reorder the elements in the spec with a document processor or PostProcess. > * Saibamen: How? > * RicoSuter: In PostProcess you reorder the Paths collection of the document... – tymtam Dec 17 '20 at 12:39

1 Answers1

0

This most likely won't give your everything you need but it's worth pointing out that SwaggerUi3Settings class contains OperationsSorter setting.

tymtam
  • 31,798
  • 8
  • 86
  • 126