{
  "$comment": "https://docs.aurorajs.dev/",
  "$id": "https://json.schemastore.org/aurora-1.0.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "definitions": {
    "property": {
      "type": "object",
      "required": ["name", "type"],
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of property, in camelCase",
          "minLength": 2
        },
        "type": {
          "type": "string",
          "description": "The type of property",
          "enum": [
            "bigint.unsigned",
            "bigint",
            "blob.long",
            "blob.medium",
            "blob.tiny",
            "blob",
            "boolean",
            "char",
            "date",
            "decimal",
            "enum",
            "float",
            "id",
            "int.unsigned",
            "int",
            "json",
            "manyToMany",
            "password",
            "relationship",
            "smallint.unsigned",
            "smallint",
            "text",
            "timestamp",
            "tinyint.unsigned",
            "tinyint",
            "varchar"
          ]
        },
        "length": {
          "type": "number",
          "description": "Set max length to property",
          "minimum": 1
        },
        "maxLength": {
          "type": "number",
          "description": "Set max length to property",
          "minimum": 1
        },
        "nullable": {
          "type": "boolean",
          "description": "Set property to nullable"
        },
        "primaryKey": {
          "type": "boolean",
          "description": "Set property to primary key"
        },
        "index": {
          "type": "string",
          "description": "To define property like a index",
          "enum": ["index", "unique"]
        },
        "indexName": {
          "type": "string",
          "description": "The name of index, if there are various indexes with the same name, they will be grouped",
          "minLength": 2
        },
        "enumOptions": {
          "type": "array",
          "description": "Values for enum type",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "defaultValue": {
          "type": ["number", "string", "boolean"],
          "description": "Default value for property"
        },
        "example": {
          "type": ["number", "string", "boolean"],
          "description": "Example value for property, this value will be used in swagger documentation"
        },
        "decimals": {
          "type": "array",
          "description": "Total digits of the number and length of the decimal places in the back of the number, example: [10, 2].",
          "items": {
            "type": "number",
            "minimum": 1
          }
        },
        "autoIncrement": {
          "type": "boolean",
          "description": "Set number property as auto increment"
        },
        "relationship": {
          "$ref": "#/definitions/relationship"
        },
        "webComponent": {
          "$ref": "#/definitions/webComponent"
        }
      }
    },
    "apiDefinition": {
      "type": "object",
      "required": ["path", "resolverType", "httpMethod"],
      "properties": {
        "path": {
          "type": "string",
          "description": "Path to access api",
          "minLength": 2
        },
        "resolverType": {
          "type": "string",
          "description": "Type of resolver, query or mutation",
          "enum": ["query", "mutation"]
        },
        "httpMethod": {
          "type": "string",
          "description": "Verb of api rest",
          "enum": ["get", "post", "put", "delete", "patch"]
        }
      }
    },
    "relationship": {
      "type": "object",
      "additionalProperties": false,
      "description": "Relationship definition for this property",
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of web component",
          "enum": [
            "many-to-many",
            "many-to-one",
            "none",
            "one-to-many",
            "one-to-one"
          ]
        },
        "singularName": {
          "type": "string",
          "description": "Singular name of the property referred to in the relationship, only for one-to-many and many-to-many relationship, example: book",
          "minLength": 2
        },
        "aggregate": {
          "type": "string",
          "description": "Aggregate referring to this relationship, example: LibraryAuthor",
          "minLength": 2
        },
        "modulePath": {
          "type": "string",
          "description": "Path to the module that refers to this relationship, example: library/author",
          "minLength": 2
        },
        "key": {
          "type": "string",
          "description": "Property key that refers to this relationship, only for many-to-one relationship, example: id",
          "minLength": 2
        },
        "field": {
          "type": "string",
          "description": "Field to obtain the relationship data, example: author",
          "minLength": 2
        },
        "avoidConstraint": {
          "type": "boolean",
          "description": "Avoid constraint rules for this relationship"
        },
        "packageName": {
          "type": "string",
          "description": "Path to packageName where is the relationship, example: @aurora-ts/core",
          "minLength": 2
        },
        "isDenormalized": {
          "type": "boolean",
          "description": "Set many-to-many relationship as denormalized, creating a field to store the selected ids"
        },
        "pivot": {
          "$ref": "#/definitions/pivotTable"
        }
      }
    },
    "webComponent": {
      "type": "object",
      "additionalProperties": false,
      "description": "Web Component that wil be rendered for this property",
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of web component",
          "enum": ["grid-select-element", "grid-elements-manager", "select"]
        }
      }
    },
    "pivotTable": {
      "type": "object",
      "additionalProperties": false,
      "description": "Relationship pivot table definition for this relationship",
      "properties": {
        "aggregate": {
          "type": "string",
          "description": "AggregateName of Pivot table, example: IamRolesAccounts",
          "minLength": 2
        },
        "modulePath": {
          "type": "string",
          "description": "Module path where table model file will be saved, example: iam/role",
          "minLength": 2
        },
        "fileName": {
          "type": "string",
          "description": "Filename of pivot table model file, example: roles-accounts",
          "minLength": 2
        }
      }
    }
  },
  "description": "Make agile applications without technical debt",
  "properties": {
    "version": {
      "type": "string",
      "description": "Schema version",
      "default": "0.0.1",
      "minLength": 2
    },
    "boundedContextName": {
      "type": "string",
      "description": "The name of the bounded context, singular in kebab-case",
      "minLength": 2
    },
    "moduleName": {
      "type": "string",
      "description": "The name of the module, singular in kebab-case",
      "minLength": 2
    },
    "moduleNames": {
      "type": "string",
      "description": "The name of the module, plural in kebab-case",
      "minLength": 2
    },
    "aggregateName": {
      "type": "string",
      "description": "The name of the aggregateName, singular in PascalCase",
      "minLength": 2
    },
    "hasOAuth": {
      "type": "boolean",
      "description": "Enabled authentication for this module",
      "default": false
    },
    "hasTenant": {
      "type": "boolean",
      "description": "Enabled tenant for this module",
      "default": false
    },
    "hasAuditing": {
      "type": "boolean",
      "description": "Enabled auditing for this module",
      "default": false
    },
    "aggregateProperties": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/property"
      }
    },
    "aggregateI18nProperties": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/property"
      }
    },
    "additionalApis": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/apiDefinition"
      }
    }
  },
  "required": [
    "boundedContextName",
    "moduleName",
    "moduleNames",
    "aggregateName"
  ],
  "title": "Aurora Agile Meta Framework",
  "type": "object"
}