{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "/schemas/mservice-node/options",
    "$ref": "#/definitions/NodeOptions",
    "definitions": {
        "NodeOptions": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "node": {
                    "$ref": "#/definitions/Node"
                },
                "services_note": {
                    "type": "string"
                },
                "services": {
                    "$ref": "#/definitions/Services"
                },
                "cors":{
                    "type":"object",
                    "additionalProperties": true
                },
                "authentication_note": {
                    "type": "string"
                },
                "authentication": {
                    "$ref": "#/definitions/NodeOptionsAuthentication"
                },
                "fastify.options note": {
                    "type": "string"
                },
                "fastify": {
                    "$ref": "#/definitions/Fastify"
                },
                "schema_note": {
                    "type": "string"
                },
                "schema": {
                    "$ref": "#/definitions/Schema"
                },
                "swagger_note": {
                    "type": "string"
                },
                "swagger": {
                    "$ref": "#/definitions/Swagger"
                },
                "logger_note": {
                    "type": "string"
                },
                "logger": {
                    "$ref": "#/definitions/Logger"
                },
                "database": {
                    "$ref": "#/definitions/Database"
                }
            },
            "required": [
                "node",
                "services"
            ],
            "title": "NodeOptions"
        },
        "NodeOptionsAuthentication": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "bearer": {
                    "$ref": "#/definitions/BearerAuth"
                },
                "jwt": {
                    "$ref": "#/definitions/JWTAuth"
                }
            },
            "anyOf": [
                {
                    "required": [
                        "bearer"
                    ]
                },
                {
                    "required": [
                        "jwt"
                    ]
                }
            ],
            "title": "NodeOptionsAuthentication"
        },
        "BearerAuth": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
                "keys": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                }
            },
            "required": [
                "keys"
            ],
            "title": "Bearer"
        },
        "JWTAuth": {
            "type": "object",
            "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": {
                        "algorithms": {
                            "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"
        },
        "Database": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "mysql": {
                    "$ref": "#/definitions/Mysql"
                }
            },
            "required": [
                "mysql"
            ],
            "title": "Database"
        },
        "Mysql": {
            "type": "object",
            "additionalProperties": true,
            "title": "Mysql"
        },
        "Fastify": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "options": {
                    "$ref": "#/definitions/Options"
                }
            },
            "required": [
                "options"
            ],
            "title": "Fastify"
        },
        "Options": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "http2": {
                    "type": "boolean"
                },
                "logger": {
                    "$ref": "#/definitions/Logger"
                },
                "bodyLimit": {
                    "type": "integer"
                }
            },
            "title": "Options"
        },
        "Logger": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "level": {
                    "type": "string",
                    "enum": [
                        "trace",
                        "debug",
                        "info",
                        "warn",
                        "error",
                        "fatal"
                    ]
                }
            },
            "required": [
                "level"
            ],
            "title": "Logger"
        },
        "Node": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "name": {
                    "$ref": "#/definitions/thai-eng_field_name"
                },
                "host": {
                    "$ref": "#/definitions/hostname"
                },
                "listen": {
                    "type": "string",
                    "format": "ipv4"
                },
                "port": {
                    "type": "integer"
                }
            },
            "required": [
                "host",
                "listen",
                "name",
                "port"
            ],
            "title": "Node"
        },
        "Schema": {
            "type": "object",
            "title": "Schema",
            "properties": {
                "use_basic": {
                    "type": "boolean"
                },
                "config": {
                    "type": "object",
                    "propertyNames": {
                        "pattern": "^[a-zA-Z][a-zA-Z0-9_\\-]*[a-zA-Z0-9]$"
                    },
                    "patternProperties": {
                        ".+$": {
                            "type": "string",
                            "format": "uri-reference"
                        }
                    }
                }
            },
            "required": [
                "use_basic"
            ]
        },
        "Swagger": {
            "type": "object",
            "title": "Swagger",
            "properties": {
                "routePrefix": {
                    "type": "string",
                    "format": "uri-reference"
                }
            },
            "required": [
                "routePrefix"
            ]
        },
        "Services": {
            "type": "object",
            "patternProperties": {
                "^.*": {
                    "$ref": "#/definitions/Service"
                }
            },
            "title": "Services"
        },
        "Service": {
            "type": "object",
            "additionalProperties": true,
            "properties": {
                "note": {
                    "type": "string"
                },
                "config": {
                    "type": "string",
                    "format": "uri-reference"
                },
                "url": {
                    "type": "string",
                    "format": "uri-reference"
                },
                "authentication": {
                    "type": "object",
                    "patternProperties": {
                        "^.*": {
                            "oneOf": [
                                {
                                    "$ref": "#/definitions/ServiceBearerAuthentication"
                                }
                            ]
                        }
                    }
                },
                "active": {
                    "type": "boolean"
                }
            },
            "required": [
                "active",
                "config",
                "url"
            ],
            "title": "Service"
        },
        "ServiceBearerAuthentication": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "key": {
                    "type": "string"
                }
            },
            "required": [
                "key"
            ],
            "title": "ServiceBearerAuthentication"
        },
        "thai-eng_field_name": {
            "type": "string",
            "pattern": "^[ก-ฮเ-ไa-zA-Z][ก-๙a-zA-Z0-9_ \\-]*[a-zA-Z0-9ก-๙]$"
        },
        "hostname": {
            "type": "string",
            "pattern": "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$"
        }
    }
}