docs: add OpenAPI responses={} to all router endpoints
Add explicit HTTP status code documentation to every endpoint across 15 router files. Each endpoint now declares all possible response codes (200/201/204/400/401/404/409/429/502/503) with descriptions so frontend can distinguish error types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -75,6 +75,11 @@ _NamePath = Annotated[
|
||||
"/jail-files",
|
||||
response_model=JailConfigFilesResponse,
|
||||
summary="List all jail config files",
|
||||
responses={
|
||||
200: {"description": "Jail config files returned", "model": JailConfigFilesResponse},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def list_jail_config_files(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -97,6 +102,13 @@ async def list_jail_config_files(
|
||||
"/jail-files/{filename}",
|
||||
response_model=JailConfigFileContent,
|
||||
summary="Return a single jail config file with its content",
|
||||
responses={
|
||||
200: {"description": "Jail config file returned", "model": JailConfigFileContent},
|
||||
400: {"description": "Filename unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_jail_config_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -123,6 +135,13 @@ async def get_jail_config_file(
|
||||
"/jail-files/{filename}",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Overwrite a jail.d config file with new raw content",
|
||||
responses={
|
||||
204: {"description": "File overwritten successfully"},
|
||||
400: {"description": "Filename unsafe or content invalid"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def write_jail_config_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -151,6 +170,13 @@ async def write_jail_config_file(
|
||||
"/jail-files/{filename}/enabled",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Enable or disable a jail configuration file",
|
||||
responses={
|
||||
204: {"description": "Enabled state updated successfully"},
|
||||
400: {"description": "Filename unsafe or operation failed"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def set_jail_config_file_enabled(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -182,6 +208,13 @@ async def set_jail_config_file_enabled(
|
||||
response_model=ConfFileContent,
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
summary="Create a new jail.d config file",
|
||||
responses={
|
||||
201: {"description": "File created", "model": ConfFileContent},
|
||||
400: {"description": "Name unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
409: {"description": "File with that name already exists"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def create_jail_config_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -220,6 +253,13 @@ async def create_jail_config_file(
|
||||
"/filters/{name}/raw",
|
||||
response_model=ConfFileContent,
|
||||
summary="Return a filter definition file's raw content",
|
||||
responses={
|
||||
200: {"description": "Filter file returned", "model": ConfFileContent},
|
||||
400: {"description": "Name unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_filter_file_raw(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -250,6 +290,13 @@ async def get_filter_file_raw(
|
||||
"/filters/{name}/raw",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Update a filter definition file (raw content)",
|
||||
responses={
|
||||
204: {"description": "Filter file updated successfully"},
|
||||
400: {"description": "Name unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def write_filter_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -276,6 +323,13 @@ async def write_filter_file(
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
response_model=ConfFileContent,
|
||||
summary="Create a new filter definition file (raw content)",
|
||||
responses={
|
||||
201: {"description": "Filter file created", "model": ConfFileContent},
|
||||
400: {"description": "Name invalid or content exceeds limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
409: {"description": "File with that name already exists"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def create_filter_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -314,6 +368,11 @@ async def create_filter_file(
|
||||
"/actions",
|
||||
response_model=ConfFilesResponse,
|
||||
summary="List all action definition files",
|
||||
responses={
|
||||
200: {"description": "Action files returned", "model": ConfFilesResponse},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def list_action_files(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -333,6 +392,13 @@ async def list_action_files(
|
||||
"/actions/{name}/raw",
|
||||
response_model=ConfFileContent,
|
||||
summary="Return an action definition file with its content",
|
||||
responses={
|
||||
200: {"description": "Action file returned", "model": ConfFileContent},
|
||||
400: {"description": "Name unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_action_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -359,6 +425,13 @@ async def get_action_file(
|
||||
"/actions/{name}/raw",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Update an action definition file",
|
||||
responses={
|
||||
204: {"description": "Action file updated successfully"},
|
||||
400: {"description": "Name unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "File not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def write_action_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -385,6 +458,13 @@ async def write_action_file(
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
response_model=ConfFileContent,
|
||||
summary="Create a new action definition file",
|
||||
responses={
|
||||
201: {"description": "Action file created", "model": ConfFileContent},
|
||||
400: {"description": "Name invalid or content exceeds limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
409: {"description": "File with that name already exists"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def create_action_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -423,6 +503,13 @@ async def create_action_file(
|
||||
"/filters/{name}/parsed",
|
||||
response_model=FilterConfig,
|
||||
summary="Return a filter file parsed into a structured model",
|
||||
responses={
|
||||
200: {"description": "Filter config returned", "model": FilterConfig},
|
||||
400: {"description": "Name unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Filter file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_parsed_filter(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -453,6 +540,13 @@ async def get_parsed_filter(
|
||||
"/filters/{name}/parsed",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Update a filter file from a structured model",
|
||||
responses={
|
||||
204: {"description": "Filter file updated successfully"},
|
||||
400: {"description": "Name unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Filter file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def update_parsed_filter(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -486,6 +580,13 @@ async def update_parsed_filter(
|
||||
"/actions/{name}/parsed",
|
||||
response_model=ActionConfig,
|
||||
summary="Return an action file parsed into a structured model",
|
||||
responses={
|
||||
200: {"description": "Action config returned", "model": ActionConfig},
|
||||
400: {"description": "Name unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Action file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_parsed_action(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -516,6 +617,13 @@ async def get_parsed_action(
|
||||
"/actions/{name}/parsed",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Update an action file from a structured model",
|
||||
responses={
|
||||
204: {"description": "Action file updated successfully"},
|
||||
400: {"description": "Name unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Action file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def update_parsed_action(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -549,6 +657,13 @@ async def update_parsed_action(
|
||||
"/jail-files/{filename}/parsed",
|
||||
response_model=JailFileConfig,
|
||||
summary="Return a jail.d file parsed into a structured model",
|
||||
responses={
|
||||
200: {"description": "Jail file config returned", "model": JailFileConfig},
|
||||
400: {"description": "Filename unsafe"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Jail file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def get_parsed_jail_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
@@ -579,6 +694,13 @@ async def get_parsed_jail_file(
|
||||
"/jail-files/{filename}/parsed",
|
||||
status_code=status.HTTP_204_NO_CONTENT,
|
||||
summary="Update a jail.d file from a structured model",
|
||||
responses={
|
||||
204: {"description": "Jail file updated successfully"},
|
||||
400: {"description": "Filename unsafe or content exceeds size limit"},
|
||||
401: {"description": "Session missing, expired, or invalid"},
|
||||
404: {"description": "Jail file not found"},
|
||||
503: {"description": "Config directory unavailable"},
|
||||
},
|
||||
)
|
||||
async def update_parsed_jail_file(
|
||||
config_dir: Fail2BanConfigDirDep,
|
||||
|
||||
Reference in New Issue
Block a user