{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "/schemas/mservice-node/service/options",
    "$ref": "#/definitions/NodeService",
    "definitions": {
        "NodeService": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
                "service": {
                    "$ref": "#/definitions/Service"
                }
            },
            "required": [
                "service"
            ],
            "title": "NodeService"
        },
        "Service": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "baseURL": {
                    "type": "string",
                    "format": "uri-reference"
                },
                "routes": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/Route"
                    }
                },
                "logger": {
                    "$ref": "#/definitions/Logger"
                },
                "authentication": {
                    "$ref": "#/definitions/NodeOptionsAuthentication"
                }
            },
            "required": [
                "baseURL",
                "routes",
                "logger"
            ],
            "title": "Service"
        },
        "Route": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "method": {
                    "type": "string"
                },
                "url": {
                    "type": "string"
                },
                "schema": {
                    "$ref": "#/definitions/Schema"
                },
                "handler": {
                    "$ref": "#/definitions/Handler"
                },
                "logLevel": {
                    "$ref": "#/definitions/LogLevel"
                }
            },
            "required": [
                "handler",
                "logLevel",
                "method",
                "url"
            ],
            "title": "Route"
        },
        "Handler": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "file": {
                    "type": "string",
                    "format": "uri-reference"
                },
                "function": {
                    "type": "string"
                }
            },
            "required": [
                "file",
                "function"
            ],
            "title": "Handler"
        },
        "Schema": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
                "params": {
                    "type": "object"
                },
                "query": {
                    "type": "object"
                },
                "body": {
                    "type": "object"
                },
                "response": {
                    "type": "object"
                }
            },
            "title": "Schema"
        },
        "LogLevel": {
            "type": "string",
            "enum": [
                "trace",
                "debug",
                "info",
                "warn",
                "error",
                "fatal"
            ]
        },
        "NodeOptionsAuthentication": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "bearer": {
                    "$ref": "#/definitions/BearerAuth"
                },
                "jwt": {
                    "$ref": "#/definitions/JWTAuth"
                }
            },
            "anyOf": [
                {
                    "required": [
                        "bearer"
                    ]
                },
                {
                    "required": [
                        "jwt"
                    ]
                }
            ],
            "title": "NodeOptionsAuthentication"
        },
        "BearerAuth": {
            "type": [
                "object",
                "null"
            ],
            "additionalProperties": true,
            "properties": {
                "keys": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                }
            },
            "required": [
                "keys"
            ],
            "title": "Bearer"
        },
        "JWTAuth": {
            "type": [
                "object",
                "null"
            ],
            "additionalProperties": false,
            "properties": {
                "secret": {
                    "type": "object",
                    "properties": {
                        "private_base64": {
                            "type": "string"
                        },
                        "public_base64": {
                            "type": "string"
                        }
                    }
                },
                "sign": {
                    "type": "object",
                    "properties": {
                        "algorithm": {
                            "type": "string"
                        },
                        "issuer": {
                            "type": "string"
                        },
                        "audience": {
                            "type": "string"
                        },
                        "subject": {
                            "type": "string"
                        },
                        "expiresIn": {
                            "anyOf": [
                                {
                                    "type": "string"
                                },
                                {
                                    "type": "integer",
                                    "minimum": 1
                                }
                            ]
                        },
                        "notBefore": {
                            "anyOf": [
                                {
                                    "type": "string"
                                },
                                {
                                    "type": "integer",
                                    "minimum": 1
                                }
                            ]
                        }
                    }
                },
                "verify": {
                    "type": "object",
                    "properties": {
                        "algorithm": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                                "type": "string"
                            }
                        },
                        "issuer": {
                            "type": "string"
                        },
                        "audience": {
                            "type": "string"
                        },
                        "subject": {
                            "type": "string"
                        },
                        "clockTolerance": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                }
            },
            "required": [
                "secret"
            ],
            "title": "JWT"
        },
        "Logger": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "level": {
                    "$ref": "#/definitions/LogLevel"
                }
            },
            "required": [
                "level"
            ],
            "title": "Logger"
        }
    }
}