from typing import Any, Dict
import colander
from cornice import Service
from cornice.service import get_services
from cornice_swagger.swagger import CorniceSwagger
from pyramid.httpexceptions import (
HTTPBadRequest,
HTTPConflict,
HTTPFailedDependency,
HTTPForbidden,
HTTPInternalServerError,
HTTPMethodNotAllowed,
HTTPNotAcceptable,
HTTPNotFound,
HTTPOk,
HTTPUnauthorized,
HTTPUnprocessableEntity
)
from pyramid.security import NO_PERMISSION_REQUIRED
from cowbird import __meta__
from cowbird.constants import get_constant
from cowbird.typedefs import JSON, HTTPMethod
from cowbird.utils import (
CONTENT_TYPE_HTML,
CONTENT_TYPE_JSON,
KNOWN_CONTENT_TYPES,
SUPPORTED_ACCEPT_TYPES,
SUPPORTED_FORMAT_TYPES,
ExtendedEnum
)
# ignore naming style of tags
# pylint: disable=C0103,invalid-name
[docs]
TitleAPI = f"{__meta__.__title__} REST API"
[docs]
InfoAPI: JSON = {
"description": __meta__.__description__,
"contact": {"name": __meta__.__maintainer__, "email": __meta__.__email__, "url": __meta__.__url__}
}
# Security
[docs]
SecurityCookieAuthAPI: JSON = {} # {"cookieAuth": {"type": "apiKey", "in": "cookie", "name": "token"}}
[docs]
SecurityDefinitionsAPI: JSON = {"securityDefinitions": SecurityCookieAuthAPI}
[docs]
SecurityAuthenticatedAPI: JSON = [{"cookieAuth": []}]
[docs]
SecurityAdministratorAPI: JSON = [{"cookieAuth": []}]
[docs]
SecurityEveryoneAPI: JSON = [{}]
[docs]
def get_security(service: Service, method: HTTPMethod) -> JSON:
definitions = service.definitions
args = {}
for definition in definitions:
met, _, args = definition
if met == method:
break
# automatically retrieve permission if specified within the view definition
permission = args.get("permission")
if permission == NO_PERMISSION_REQUIRED:
return SecurityEveryoneAPI
if permission == get_constant("COWBIRD_ADMIN_PERMISSION"):
return SecurityAdministratorAPI
# return default admin permission otherwise unless specified form cornice decorator
return SecurityAdministratorAPI if "security" not in args else args["security"]
[docs]
def service_api_route_info(service_api: Service, **kwargs: Any) -> Dict[str, Any]:
"""
Employed to simplify Pyramid route and view config definitions from same schema objects.
"""
kwargs.update({
"name": service_api.name,
"pattern": service_api.path,
})
kwargs.setdefault("traverse", getattr(service_api, "traverse", None))
kwargs.setdefault("factory", getattr(service_api, "factory", None))
return kwargs
[docs]
class ValidOperations(ExtendedEnum):
"""
Valid values as webhook event.
"""
[docs]
CreateOperation = "created"
[docs]
DeleteOperation = "deleted"
[docs]
def generate_api_schema(swagger_base_spec: JSON) -> JSON:
"""
Return JSON Swagger specifications of Cowbird REST API.
Uses Cornice Services and Schemas to return swagger specification.
:param swagger_base_spec: dictionary that specifies the 'host' and list of HTTP 'schemes' to employ.
"""
generator = CorniceSwagger(get_services())
# function docstrings are used to create the route's summary in Swagger-UI
generator.summary_docstrings = True
generator.default_security = get_security
swagger_base_spec.update(SecurityDefinitionsAPI) # type: ignore[arg-type]
generator.swagger = swagger_base_spec
json_api_spec = generator.generate(title=TitleAPI, version=__meta__.__version__, info=InfoAPI)
for tag in json_api_spec["tags"]:
tag["description"] = TAG_DESCRIPTIONS[tag["name"]]
return json_api_spec
# Service Routes
[docs]
SwaggerGenerator = Service(
path="/json",
name="swagger_schema_json")
[docs]
SwaggerAPI = Service(
path="/api",
name="swagger_schema_ui",
description=f"{TitleAPI} documentation")
[docs]
VersionAPI = Service(
path="/version",
name="Version")
[docs]
HomepageAPI = Service(
path="/",
name="homepage")
[docs]
HandlersAPI = Service(
path="/handlers",
name="handler_list")
[docs]
HandlerAPI = Service(
path="/handlers/{handler_name}",
name="handler_detail")
[docs]
HandlerResyncAPI = Service(
path="/handlers/{handler_name}/resync",
name="handler_resync")
[docs]
UserWebhookAPI = Service(
path="/webhooks/users",
name="user_webhook")
[docs]
PermissionWebhookAPI = Service(
path="/webhooks/permissions",
name="permission_webhook")
# Path parameters
[docs]
OperationParameter = colander.SchemaNode(
colander.String(),
description="Operation to interact with.",
example="users",)
[docs]
HandlerNameParameter = colander.SchemaNode(
colander.String(),
description="Registered handler name.",
example="my-wps")
[docs]
class Handler_RequestPathSchema(colander.MappingSchema):
[docs]
handler_name = HandlerNameParameter
# Tags
[docs]
WebhooksTag = "Webhooks"
[docs]
HandlersTag = "Handlers"
[docs]
TAG_DESCRIPTIONS = {
APITag: "General information about the API.",
WebhooksTag:
f"Webhooks that are managed by {__meta__.__title__}.\n\n" +
"Each of the managed webhook provides specific functionalities against specific handlers of the stack.",
HandlersTag:
f"Handlers that are managed by {__meta__.__title__}.\n\n" +
"Each handler defines information such as endpoint and configuration details for running webhooks.",
}
# Header definitions
[docs]
class AcceptType(colander.SchemaNode):
[docs]
schema_type = colander.String
[docs]
default = CONTENT_TYPE_JSON
[docs]
example = CONTENT_TYPE_JSON
[docs]
missing = colander.drop
[docs]
class ContentType(colander.SchemaNode):
[docs]
schema_type = colander.String
[docs]
name = "Content-Type"
[docs]
default = CONTENT_TYPE_JSON
[docs]
example = CONTENT_TYPE_JSON
[docs]
missing = colander.drop
[docs]
class QueryRequestSchemaAPI(colander.MappingSchema):
[docs]
class BaseRequestSchemaAPI(colander.MappingSchema):
[docs]
querystring = QueryRequestSchemaAPI()
[docs]
class BaseResponseSchemaAPI(colander.MappingSchema):
[docs]
class BaseResponseBodySchema(colander.MappingSchema):
def __init__(self, code: int, description: str, **kw: Any) -> None:
super(BaseResponseBodySchema, self).__init__(**kw)
assert isinstance(code, int) # nosec: B101
assert isinstance(description, str) # nosec: B101
self.__code = code # pylint: disable=W0238,unused-private-member
self.__desc = description # pylint: disable=W0238,unused-private-member
# update the values
child_nodes = getattr(self, "children", [])
child_nodes.append(colander.SchemaNode(
colander.Integer(),
name="code",
description="HTTP response code",
example=code))
child_nodes.append(colander.SchemaNode(
colander.String(),
name="type",
description="Response content type",
example=CONTENT_TYPE_JSON))
child_nodes.append(colander.SchemaNode(
colander.String(),
name="detail",
description="Response status message",
example=description))
[docs]
class ErrorVerifyParamConditions(colander.MappingSchema):
[docs]
not_none = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
not_empty = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
not_in = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
not_equal = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_none = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_empty = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_in = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_equal = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_true = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_false = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
is_type = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
matches = colander.SchemaNode(colander.Boolean(), missing=colander.drop)
[docs]
class ErrorVerifyParamBodySchema(colander.MappingSchema):
[docs]
name = colander.SchemaNode(
colander.String(),
description="Name of the failing condition parameter that caused the error.",
missing=colander.drop)
[docs]
value = colander.SchemaNode(
colander.String(),
description="Value of the failing condition parameter that caused the error.",
default=None)
[docs]
compare = colander.SchemaNode(
colander.String(),
description="Comparison value(s) employed for evaluation of the failing condition parameter.",
missing=colander.drop)
[docs]
conditions = ErrorVerifyParamConditions(
description="Evaluated conditions on the parameter value with corresponding validation status. "
"Some results are relative to the comparison value when provided.")
[docs]
class ErrorFallbackBodySchema(colander.MappingSchema):
[docs]
exception = colander.SchemaNode(colander.String(), description="Raise exception.")
[docs]
error = colander.SchemaNode(colander.String(), description="Error message describing the cause of exception.")
[docs]
class ErrorCallBodySchema(ErrorFallbackBodySchema):
[docs]
detail = colander.SchemaNode(colander.String(), description="Contextual explanation about the cause of error.")
[docs]
content = colander.MappingSchema(default=None, unknown="preserve",
description="Additional contextual details that lead to the error. "
"Can have any amount of sub-field to describe evaluated values.")
[docs]
class ErrorResponseBodySchema(BaseResponseBodySchema):
def __init__(self, code: int, description: str, **kw: Any) -> None:
super(ErrorResponseBodySchema, self).__init__(code, description, **kw)
assert code >= 400 # nosec: B101
[docs]
route_name = colander.SchemaNode(
colander.String(),
description="Route called that generated the error.",
example="/users/toto")
[docs]
request_url = colander.SchemaNode(
colander.String(),
title="Request URL",
description="Request URL that generated the error.",
example="http://localhost:2001/cowbird/users/toto")
[docs]
method = colander.SchemaNode(
colander.String(),
description="Request method that generated the error.",
example="GET")
[docs]
param = ErrorVerifyParamBodySchema(
title="Parameter",
missing=colander.drop,
description="Additional parameter details to explain the cause of error.")
[docs]
call = ErrorCallBodySchema(
missing=colander.drop,
description="Additional details to explain failure reason of operation call or raised error.")
[docs]
fallback = ErrorFallbackBodySchema(
missing=colander.drop,
description="Additional details to explain failure reason of fallback operation to clean up the call error.")
[docs]
class InternalServerErrorResponseBodySchema(ErrorResponseBodySchema):
def __init__(self, **kw: Any) -> None:
kw["code"] = HTTPInternalServerError.code
super(InternalServerErrorResponseBodySchema, self).__init__(**kw)
[docs]
class BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Required value for request is missing."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class UnauthorizedResponseBodySchema(ErrorResponseBodySchema):
def __init__(self, **kw: Any) -> None:
kw["code"] = HTTPUnauthorized.code
super(UnauthorizedResponseBodySchema, self).__init__(**kw)
[docs]
route_name = colander.SchemaNode(colander.String(), description="Specified API route.")
[docs]
request_url = colander.SchemaNode(colander.String(), description="Specified request URL.")
[docs]
class UnauthorizedResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Unauthorized access to this resource. Missing authentication headers or cookies."
[docs]
body = UnauthorizedResponseBodySchema(code=HTTPUnauthorized.code, description=description)
[docs]
class HTTPForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Forbidden operation for this resource or insufficient user privileges."
[docs]
body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs]
class NotFoundResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "The route resource could not be found."
[docs]
body = ErrorResponseBodySchema(code=HTTPNotFound.code, description=description)
[docs]
class MethodNotAllowedResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "The method is not allowed for this resource."
[docs]
body = ErrorResponseBodySchema(code=HTTPMethodNotAllowed.code, description=description)
[docs]
class NotAcceptableResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Unsupported Content-Type in 'Accept' header was specified."
[docs]
body = ErrorResponseBodySchema(code=HTTPNotAcceptable.code, description=description)
[docs]
class UnprocessableEntityResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Invalid value specified."
[docs]
body = ErrorResponseBodySchema(code=HTTPUnprocessableEntity.code, description=description)
[docs]
class InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Internal Server Error. Unhandled exception occurred."
[docs]
body = ErrorResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs]
class PermissionSchema(colander.SchemaNode):
[docs]
description = "Managed permission under a service."
[docs]
schema_type = colander.String
[docs]
example = "test-permission"
[docs]
class PermissionListSchema(colander.SequenceSchema):
[docs]
description = "List of managed permissions under a service."
[docs]
permission = PermissionSchema()
[docs]
class ResourceSchema(colander.SchemaNode):
[docs]
description = "Managed resource under a service."
[docs]
schema_type = colander.String
[docs]
example = "test-resource"
[docs]
class ResourceListSchema(colander.SequenceSchema):
[docs]
description = "List of managed resources under a service."
[docs]
resource = ResourceSchema()
[docs]
class HandlerSummarySchema(colander.SchemaNode):
[docs]
description = "Managed handler."
[docs]
schema_type = colander.String
[docs]
example = "test-handler"
[docs]
class HandlerListSchema(colander.SequenceSchema):
[docs]
description = "List of managed handlers."
[docs]
handler = colander.SchemaNode(
colander.String(),
description="Name of the handler.",
example="Thredds"
)
[docs]
class HandlerConfigurationSchema(colander.MappingSchema):
[docs]
description = "Custom configuration of the handler. Expected format and fields specific to each handler type."
[docs]
missing = colander.drop
[docs]
default = colander.null
[docs]
class HandlerDetailSchema(colander.MappingSchema):
[docs]
name = colander.SchemaNode(
colander.String(),
description="Name of the handler",
example="thredds"
)
[docs]
type = colander.SchemaNode(
colander.String(),
description="Type of the handler",
example="thredds"
)
[docs]
url = colander.SchemaNode(
colander.String(),
missing=colander.drop, # if listed with corresponding scope (users/groups/admin)
description="URL of the handler (restricted access)",
example="http://localhost:9999/thredds"
)
[docs]
resources = ResourceListSchema()
[docs]
permissions = PermissionListSchema()
[docs]
class Handlers_GET_RequestSchema(BaseRequestSchemaAPI):
pass
[docs]
class Handlers_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs]
handlers = HandlerListSchema()
[docs]
class Handlers_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Get handlers successful."
[docs]
body = Handlers_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Handlers_GET_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Invalid handler name."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class Handlers_POST_RequestBodySchema(HandlerDetailSchema):
pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs]
class Handlers_POST_RequestSchema(BaseRequestSchemaAPI):
[docs]
body = Handlers_POST_RequestBodySchema()
[docs]
class Handlers_POST_CreatedResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Handler creation successful."
[docs]
body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Handlers_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Invalid value parameters for handler creation."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class Handler_SummaryBodyResponseSchema(BaseResponseBodySchema):
[docs]
handler = HandlerSummarySchema()
[docs]
class Handler_GET_RequestSchema(BaseRequestSchemaAPI):
[docs]
path = Handler_RequestPathSchema()
[docs]
class Handler_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs]
handler = HandlerDetailSchema()
[docs]
class Handler_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Get handler successful."
[docs]
body = Handler_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Handler_Check_NotFoundResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Could not find specified handler."
[docs]
body = ErrorResponseBodySchema(code=HTTPNotFound.code, description=description)
[docs]
class HandlerResync_PUT_RequestSchema(BaseRequestSchemaAPI):
[docs]
path = Handler_RequestPathSchema()
[docs]
class HandlerResync_PUT_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Handler resync successful."
[docs]
body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Handlers_POST_ForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Handler registration forbidden."
[docs]
body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs]
class Handlers_POST_ConflictResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Specified 'handler_name' value already exists."
[docs]
body = ErrorResponseBodySchema(code=HTTPConflict.code, description=description)
[docs]
class Handlers_POST_UnprocessableEntityResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Handler creation for registration failed."
[docs]
body = ErrorResponseBodySchema(code=HTTPUnprocessableEntity.code, description=description)
[docs]
class Handlers_POST_InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Handler registration status could not be validated."
[docs]
body = ErrorResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs]
class Handler_PATCH_RequestBodySchema(HandlerDetailSchema):
pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs]
class Handler_PATCH_RequestSchema(BaseRequestSchemaAPI):
[docs]
path = Handler_RequestPathSchema()
[docs]
body = Handler_PATCH_RequestBodySchema()
[docs]
class Handler_PATCH_ResponseBodySchema(Handler_GET_ResponseBodySchema):
pass # FIXME: define fields with derived from MappingSchema if request accepts different fields
[docs]
class Handler_PATCH_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Update handler successful."
[docs]
body = Handler_PATCH_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Handler_PATCH_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Registered handler values are already equal to update values."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class Handler_PATCH_ForbiddenResponseSchema_ReservedKeyword(BaseResponseSchemaAPI):
[docs]
description = "Update handler name to 'types' not allowed (reserved keyword)."
[docs]
body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs]
class Handler_PATCH_ForbiddenResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Update handler failed during value assignment."
[docs]
body = ErrorResponseBodySchema(code=HTTPForbidden.code, description=description)
[docs]
class Handler_PATCH_UnprocessableEntityResponseSchema(Handlers_POST_UnprocessableEntityResponseSchema):
pass
[docs]
class UserWebhook_POST_RequestBodySchema(colander.MappingSchema):
[docs]
event = colander.SchemaNode(
colander.String(),
description="User event.",
validator=colander.OneOf(ValidOperations.values())
)
[docs]
user_name = colander.SchemaNode(
colander.String(),
description="User name being created or deleted."
)
[docs]
callback_url = colander.SchemaNode(
colander.String(),
description="Callback url to call in case of error while handling user creation.",
missing=colander.drop
)
[docs]
class UserWebhook_POST_RequestSchema(BaseRequestSchemaAPI):
[docs]
body = UserWebhook_POST_RequestBodySchema()
[docs]
class UserWebhook_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Invalid value parameters for user webhook."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class UserWebhook_POST_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "User event successfully handled."
[docs]
body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class UserWebhook_POST_InternalServerErrorResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Failed to handle user webhook event."
[docs]
body = BaseResponseBodySchema(code=HTTPInternalServerError.code, description=description)
[docs]
class PermissionWebhook_POST_RequestBodySchema(colander.MappingSchema):
[docs]
event = colander.SchemaNode(
colander.String(),
description="Permission event.",
validator=colander.OneOf(ValidOperations.values())
)
[docs]
service_name = colander.SchemaNode(
colander.String(),
description="Service name of the resource affected by the permission update."
)
[docs]
resource_id = colander.SchemaNode(
colander.String(),
description="Identifier of the resource affected by the permission update."
)
[docs]
resource_full_name = colander.SchemaNode(
colander.String(),
description="Full resource name including parents of the resource affected by the permission update.",
example="thredds/birdhouse/file.nc"
)
[docs]
name = colander.SchemaNode(
colander.String(),
description="Permission name applicable to the service/resource.",
example="read"
)
[docs]
access = colander.SchemaNode(
colander.String(),
description="Permission access rule to the service/resource.",
example="allow"
)
[docs]
scope = colander.SchemaNode(
colander.String(),
description="Permission scope over service/resource tree hierarchy.",
example="recursive"
)
[docs]
user = colander.SchemaNode(
colander.String(),
description="User name for which the permission is applied or dropped. (User or group must be provided).",
missing=colander.drop
)
[docs]
group = colander.SchemaNode(
colander.String(),
description="Group name for which the permission is applied or dropped. (User or group must be provided).",
missing=colander.drop
)
[docs]
class PermissionWebhook_POST_RequestSchema(BaseRequestSchemaAPI):
[docs]
body = PermissionWebhook_POST_RequestBodySchema()
[docs]
class PermissionWebhook_POST_BadRequestResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Invalid value parameters for permission webhook."
[docs]
body = ErrorResponseBodySchema(code=HTTPBadRequest.code, description=description)
[docs]
class PermissionWebhook_POST_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Permission event successfully handled."
[docs]
body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class Version_GET_ResponseBodySchema(BaseResponseBodySchema):
[docs]
version = colander.SchemaNode(
colander.String(),
description="Cowbird API version string",
example=__meta__.__version__)
[docs]
worker_version = colander.SchemaNode(
colander.String(),
description="Cowbird worker version string",
example=__meta__.__version__,
default=None)
[docs]
db_version = colander.SchemaNode(
colander.String(),
description="Database version string",
exemple="a395ef9d3fe6")
[docs]
version_detail = colander.SchemaNode(
colander.String(),
description="Version detail string")
[docs]
class Version_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Get version successful."
[docs]
body = Version_GET_ResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class FailedDependencyErrorResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Version dependencies could not all be identified."
[docs]
body = ErrorResponseBodySchema(code=HTTPFailedDependency.code, description=description)
[docs]
class Homepage_GET_OkResponseSchema(BaseResponseSchemaAPI):
[docs]
description = "Get homepage successful."
[docs]
body = BaseResponseBodySchema(code=HTTPOk.code, description=description)
[docs]
class SwaggerAPI_GET_OkResponseSchema(colander.MappingSchema):
[docs]
body = colander.SchemaNode(colander.String(), example="This page!")
# Responses for specific views
[docs]
Handlers_GET_responses = {
"200": Handlers_GET_OkResponseSchema(),
"400": Handlers_GET_BadRequestResponseSchema(),
"401": UnauthorizedResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
Handlers_POST_responses = {
"201": Handlers_POST_CreatedResponseSchema(),
"400": Handlers_POST_BadRequestResponseSchema(),
"401": UnauthorizedResponseSchema(),
"403": Handlers_POST_ForbiddenResponseSchema(),
"406": NotAcceptableResponseSchema(),
"409": Handlers_POST_ConflictResponseSchema(),
"422": Handlers_POST_UnprocessableEntityResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
Handler_GET_responses = {
"200": Handler_GET_OkResponseSchema(),
"401": UnauthorizedResponseSchema(),
"404": Handler_Check_NotFoundResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
Handler_PATCH_responses = {
"200": Handler_PATCH_OkResponseSchema(),
"400": Handler_PATCH_BadRequestResponseSchema(),
"401": UnauthorizedResponseSchema(),
"403": Handler_PATCH_ForbiddenResponseSchema(),
"406": NotAcceptableResponseSchema(),
"422": Handler_PATCH_UnprocessableEntityResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
HandlerResync_PUT_responses = {
"200": HandlerResync_PUT_OkResponseSchema(),
"404": Handler_Check_NotFoundResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
UserWebhook_POST_responses = {
"200": UserWebhook_POST_OkResponseSchema(),
"400": UserWebhook_POST_BadRequestResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
PermissionWebhook_POST_responses = {
"200": PermissionWebhook_POST_OkResponseSchema(),
"400": PermissionWebhook_POST_BadRequestResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
Version_GET_responses = {
"200": Version_GET_OkResponseSchema(),
"406": NotAcceptableResponseSchema(),
"424": FailedDependencyErrorResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
Homepage_GET_responses = {
"200": Homepage_GET_OkResponseSchema(),
"406": NotAcceptableResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}
[docs]
SwaggerAPI_GET_responses = {
"200": SwaggerAPI_GET_OkResponseSchema(),
"500": InternalServerErrorResponseSchema(),
}