Skip to content

Custom path ignored when route name specified #166

Description

@chmely

Expected Behavior

When I specify the Name and custom Path parameters in the Route() attribute both are used to generate the swagger file

Actual Behavior

When Name is specified the custom Path is ignored.

Steps to Reproduce the Problem

  1. Create a Nancy method, e.g.:
public class TestModule: NancyModule
{
    public TestModule()
    {
        Get("/test/{param:guid}", ctx => AMethod(ctx.param), name: "AMethod");
    }

    [Route("AMethod")]
    [Route(HttpMethod.Get, "/test/{param}")]
    [RouteParam(ParameterIn.Path, Name = "param", ParamType = typeof(Guid), Required = true)]
    private object AMethod(Guid param) => param.ToString();
}
  1. Generate swagger docs
  2. The route in the doc says '/test/{param:guid}' instead of /test/{param}' and you get a parse error at editor.swagger.io saying that "Declared path parameter "param:guid" needs to be defined as a path parameter at either the path or operation level"

Specifications

I think the problem is in the code in Nancy.Swagger.Annotations / RouteId.Create() method, if the code

            if (!string.IsNullOrEmpty(swaggerRouteAttribute.Name))
            {
                routeId.Name = swaggerRouteAttribute.Name;
            }
            else if (swaggerRouteAttribute.Path != null)
            {
                routeId.Method = swaggerRouteAttribute.Method;
                routeId.Path = module.ModulePath.EnsureForwardSlash() + swaggerRouteAttribute.Path;
                routeId.Path = routeId.Path.Replace("//", "/");
            }

was modified to do without the else keyword into

            if (!string.IsNullOrEmpty(swaggerRouteAttribute.Name))
            {
                routeId.Name = swaggerRouteAttribute.Name;
            }
            if (swaggerRouteAttribute.Path != null)
            {
                routeId.Method = swaggerRouteAttribute.Method;
                routeId.Path = module.ModulePath.EnsureForwardSlash() + swaggerRouteAttribute.Path;
                routeId.Path = routeId.Path.Replace("//", "/");
            }

it would work as expected

  • Version: 2.2.53-alpha
  • Project:
  • Platform:
  • Subsystem:

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions