flask-openapi3 icon indicating copy to clipboard operation
flask-openapi3 copied to clipboard

provide a way to order the endpoints

Open nioncode opened this issue 1 year ago • 4 comments

Is there a way to modify the order of the endpoints? Currently it seems they are grouped by tags and then sorted alphabetically by their path, which results in non-intuitive ordering (at least in our use case).

Assume we have the endpoints:

  • /start
  • /finish

Naturally, we'd like to see /start before /finish in the documentation, but currently these are reversed.

It would be great if we could provide a custom name used for sorting, e.g. something like:

@bp.post("/start", sorting_name="1_start")
def start():
    pass

@bp.post("/finish", sorting_name="2_finish")
def finish():
    pass

It would also be possible by using a simple integer for the sort order, but I think having a string and then keep using the alphabetical sorting order allows more customization and is less brittle when adding a new function, since we could also create some kind of subgroups between requests to order some requests relative to each other without impacting global order, e.g.:

@bp.post("/something/start", sorting_name="something_1_start")
def start():
    pass

@bp.post("/something/finish", sorting_name="something_2_finish")
def finish():
    pass

@bp.post("/other/start", sorting_name="other_1_start")
def start2():
    pass

@bp.post("/other/finish", sorting_name="other_2_finish")
def finish2():
    pass

Does something like this maybe already exist?

nioncode avatar Aug 07 '24 09:08 nioncode

@nioncode If you want to change the endpoint order of the swagger, you can change the default behavior by setting the SWAGGER_CONFIG.

from flask_openapi3 import OpenAPI

app = OpenAPI(__name__)

app.config["SWAGGER_CONFIG"] = {
    "operationsSorter":"method"
}

operationsSorter | Unavailable | Function=(a => a). Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), 'method' (sort by HTTP method) or a function (see Array.prototype.sort() to know how sort function works). Default is the order returned by the server unchanged.

luolingchun avatar Aug 11 '24 08:08 luolingchun

Sorry for my late response. Is there a similar flag to control the redoc API?

I found out that the order of the endpoints is actually how they are in our python code in the generated api.json when generating it via flask openapi -o api.json, so I guess it is not the responsibility of flask-openapi3 to sort the endpoints, but of the tool that generates the redoc API afterwards.

nioncode avatar Nov 15 '24 09:11 nioncode

I've found that some configurations can be used:

usage:

app.config["REDOC_CONFIG"] = {
    "sortOperationsAlphabetically": True
}

luolingchun avatar Nov 27 '24 01:11 luolingchun

The problem is that we don't want to sort alphabetically, but semantically. E.g. a start endpoint should come before a finish endpoint, but through alphabetical order it would be

  • finish
  • start

nioncode avatar Nov 27 '24 13:11 nioncode