✨ feat(schema): enhance API configuration schemas with new properties and validations
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
- Updated collection.json to include upload defaults, audit logging, query limits, and more. - Enhanced collectionNavigation.json with viewHint configurations. - Added project-wide upload defaults and hook configurations in config.json. - Expanded field.json to support new field types, validations, and properties. - Improved fieldMeta.json with additional widget configurations and properties. - Updated hooks.json to include new bulk operation hooks and audit logging. - Enhanced imageFilter.json with additional image processing options. - Added timeout properties to job.json for better execution control. - Refined permissions.json to allow more granular control over HTTP method permissions and added filter and field visibility options.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "JSON Schema tibi-server collection configuration",
|
||||
"description": "tibi-server collection linter",
|
||||
"description": "tibi-server collection configuration",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"patternProperties": {
|
||||
@@ -22,14 +22,39 @@
|
||||
"type": "string",
|
||||
"description": "relative to config.yml, path for file uploads"
|
||||
},
|
||||
"upload": {
|
||||
"type": "object",
|
||||
"description": "collection-specific upload defaults and restrictions",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"maxBodySize": {
|
||||
"type": "string",
|
||||
"description": "request body size limit override for this collection (e.g. '10MB')"
|
||||
},
|
||||
"allowedMimeTypes": {
|
||||
"type": "array",
|
||||
"description": "allowed MIME types for file uploads in this collection; empty means all types are allowed",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"description": "meta object used for admin ui configuration",
|
||||
"additionalProperties": true,
|
||||
"allOf": [{ "$ref": "collectionNavigation.json" }],
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "collectionNavigation.json"
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"rowIdentTpl": {
|
||||
"description": "template which evaluates to short string to identify entry in pe. select boxes",
|
||||
@@ -57,6 +82,28 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"pagebuilder": {
|
||||
"type": "object",
|
||||
"description": "Collection-level pagebuilder defaults. These serve as fallbacks when field-level pagebuilder config omits them.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"blockTypeField": {
|
||||
"type": "string",
|
||||
"description": "Name of the sub-field that holds the block type identifier. Default: 'blockType'. Used as fallback for all pagebuilder fields in this collection."
|
||||
},
|
||||
"blockRegistry": {
|
||||
"type": "object",
|
||||
"description": "Block registry configuration.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "URL to an ES module that default-exports a BlockRegistry. Used as fallback for all pagebuilder fields in this collection."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,31 +111,54 @@
|
||||
},
|
||||
"projections": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{ "$ref": "projections.json" }
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"$ref": "projections.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"permissions": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{ "$ref": "permissions.json" }
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"$ref": "permissions.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"hooks": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{ "$ref": "hooks.json" }
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"$ref": "hooks.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"imageFilter": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{ "$ref": "imageFilter.json" }
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"$ref": "imageFilter.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"fields": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "array",
|
||||
"description": "fields of collection",
|
||||
@@ -108,7 +178,10 @@
|
||||
},
|
||||
"indexes": {
|
||||
"oneOf": [
|
||||
{ "$comment": "for include tag", "type": "string" },
|
||||
{
|
||||
"$comment": "for include tag",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "array",
|
||||
"description": "indexes of collection",
|
||||
@@ -126,6 +199,32 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"bulk": {
|
||||
"type": "object",
|
||||
"description": "bulk operation configuration",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"optimize": {
|
||||
"type": "object",
|
||||
"description": "enable optimised single-DB-call bulk path without requiring a hook file",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"create": {
|
||||
"type": "boolean",
|
||||
"description": "POST with JSON array uses optimised InsertMany path"
|
||||
},
|
||||
"update": {
|
||||
"type": "boolean",
|
||||
"description": "PUT without ID uses optimised path"
|
||||
},
|
||||
"delete": {
|
||||
"type": "boolean",
|
||||
"description": "DELETE without ID uses optimised path"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"cors": {
|
||||
"type": "object",
|
||||
"description": "cors configuration",
|
||||
@@ -172,7 +271,119 @@
|
||||
"description": "max age in seconds"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"type": "object",
|
||||
"description": "audit logging configuration for this collection",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean",
|
||||
"description": "enable audit logging for this collection"
|
||||
},
|
||||
"actions": {
|
||||
"type": "array",
|
||||
"description": "list of actions to audit (create, update, delete, bulkCreate, bulkUpdate, bulkDelete, get)",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"create",
|
||||
"update",
|
||||
"delete",
|
||||
"bulkCreate",
|
||||
"bulkUpdate",
|
||||
"bulkDelete",
|
||||
"get"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"queryLimits": {
|
||||
"type": "object",
|
||||
"description": "query limit configuration for GET requests",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"defaultLimit": {
|
||||
"type": "integer",
|
||||
"description": "default limit for GET queries if client doesn't specify one"
|
||||
},
|
||||
"maxLimit": {
|
||||
"type": "integer",
|
||||
"description": "maximum allowed limit for GET queries"
|
||||
}
|
||||
}
|
||||
},
|
||||
"readonlyFields": {
|
||||
"type": "array",
|
||||
"description": "fields that are read-only at collection level",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"hiddenFields": {
|
||||
"type": "array",
|
||||
"description": "fields that are hidden at collection level",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
"type": "array",
|
||||
"description": "search configurations for the collection",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "search config name (used in query parameter qName)"
|
||||
},
|
||||
"mode": {
|
||||
"type": "string",
|
||||
"description": "search mode",
|
||||
"enum": [
|
||||
"text",
|
||||
"regex",
|
||||
"eval",
|
||||
"filter"
|
||||
]
|
||||
},
|
||||
"fields": {
|
||||
"type": "array",
|
||||
"description": "fields to search in (for text/regex mode)",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"type": "object",
|
||||
"description": "meta information",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"eval": {
|
||||
"type": "string",
|
||||
"description": "JS eval expression (for eval mode)"
|
||||
},
|
||||
"filter": {
|
||||
"type": "object",
|
||||
"description": "MongoDB filter template (for filter mode)",
|
||||
"additionalProperties": true
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"mode"
|
||||
]
|
||||
}
|
||||
},
|
||||
"strictFields": {
|
||||
"type": "boolean",
|
||||
"description": "reject unknown fields not defined in the fields array"
|
||||
}
|
||||
},
|
||||
"required": ["name", "permissions"]
|
||||
}
|
||||
"required": [
|
||||
"name",
|
||||
"permissions"
|
||||
]
|
||||
}
|
||||
@@ -22,6 +22,61 @@
|
||||
"type": "string",
|
||||
"description": "image filter name used for image previews"
|
||||
},
|
||||
"viewHint": {
|
||||
"description": "default collection view hint or structured special view config",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"table",
|
||||
"cards",
|
||||
"media"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"navigation": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"nodesField": {
|
||||
"type": "string",
|
||||
"description": "root field containing the recursive node array"
|
||||
},
|
||||
"declaredTrees": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"label": {
|
||||
"$ref": "definitions.json#/definitions/i18nString"
|
||||
},
|
||||
"singleton": {
|
||||
"type": "object",
|
||||
"description": "root-level field values that identify one declared tree slot",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"maxLevel": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"singleton"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"navigation"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"muiIcon": {
|
||||
"type": "string",
|
||||
"description": "material ui icon name"
|
||||
|
||||
@@ -35,6 +35,24 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"upload": {
|
||||
"type": "object",
|
||||
"description": "project-wide upload defaults and restrictions",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"maxBodySize": {
|
||||
"type": "string",
|
||||
"description": "default request body size limit for collections in this project (e.g. '50MB')"
|
||||
},
|
||||
"allowedMimeTypes": {
|
||||
"type": "array",
|
||||
"description": "project-wide allowed MIME types for file uploads; empty means all types are allowed",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"collections": {
|
||||
"type": "array",
|
||||
"description": "list of collections in this project",
|
||||
@@ -150,6 +168,59 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"hook": {
|
||||
"type": "object",
|
||||
"description": "project-level hook configuration (cache and ratelimit)",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"cache": {
|
||||
"type": "object",
|
||||
"description": "hook cache configuration",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"maxEntries": {
|
||||
"type": "integer",
|
||||
"description": "maximum number of cache entries"
|
||||
},
|
||||
"defaultTTL": {
|
||||
"type": "string",
|
||||
"description": "default time-to-live (e.g. '5m', '1h')"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ratelimit": {
|
||||
"type": "object",
|
||||
"description": "hook ratelimit configuration",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"backoffInitialDelay": {
|
||||
"type": "string",
|
||||
"description": "initial backoff delay (e.g. '1s')"
|
||||
},
|
||||
"backoffMaxDelay": {
|
||||
"type": "string",
|
||||
"description": "maximum backoff delay (e.g. '5m')"
|
||||
},
|
||||
"backoffResetAfter": {
|
||||
"type": "string",
|
||||
"description": "reset backoff after this duration of no failures (e.g. '15m')"
|
||||
},
|
||||
"windowSize": {
|
||||
"type": "string",
|
||||
"description": "sliding window size (e.g. '1m')"
|
||||
},
|
||||
"windowMaxHits": {
|
||||
"type": "integer",
|
||||
"description": "maximum hits allowed per window"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"strictFields": {
|
||||
"type": "boolean",
|
||||
"description": "reject unknown fields not defined in the fields array (project-wide default)"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
"object",
|
||||
"object[]",
|
||||
"file",
|
||||
"file[]",
|
||||
"date",
|
||||
"any"
|
||||
]
|
||||
@@ -32,7 +33,13 @@
|
||||
"index": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"enum": ["single", "unique", "text"]
|
||||
"enum": [
|
||||
"single",
|
||||
"unique",
|
||||
"text",
|
||||
"sparse",
|
||||
"background"
|
||||
]
|
||||
}
|
||||
},
|
||||
"subFields": {
|
||||
@@ -74,12 +81,82 @@
|
||||
"eval": {
|
||||
"type": "string",
|
||||
"description": "javascript validator which failes if evaluates to false or string as error message, with following variables: $this, $parent, $stack, $auth, context"
|
||||
},
|
||||
"minLength": {
|
||||
"type": "number",
|
||||
"description": "minimum string length"
|
||||
},
|
||||
"maxLength": {
|
||||
"type": "number",
|
||||
"description": "maximum string length"
|
||||
},
|
||||
"pattern": {
|
||||
"type": "string",
|
||||
"description": "regex pattern the value must match"
|
||||
},
|
||||
"min": {
|
||||
"type": "number",
|
||||
"description": "minimum value for number fields"
|
||||
},
|
||||
"max": {
|
||||
"type": "number",
|
||||
"description": "maximum value for number fields"
|
||||
},
|
||||
"in": {
|
||||
"type": "array",
|
||||
"description": "array of allowed values"
|
||||
},
|
||||
"maxFileSize": {
|
||||
"type": "string",
|
||||
"description": "maximum decoded file size for file and file[] fields (e.g. '500KB')"
|
||||
},
|
||||
"accept": {
|
||||
"type": "array",
|
||||
"description": "allowed MIME types for file and file[] fields; supports wildcards like 'image/*'",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"readonly": {
|
||||
"description": "field-level readonly — boolean or JS eval expression",
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"eval": { "type": "string", "description": "JS expression that returns boolean" }
|
||||
},
|
||||
"required": ["eval"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"hidden": {
|
||||
"description": "field-level hidden — boolean or JS eval expression",
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"eval": { "type": "string", "description": "JS expression that returns boolean" }
|
||||
},
|
||||
"required": ["eval"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"strictFields": {
|
||||
"type": "boolean",
|
||||
"description": "reject unknown sub-fields not defined in subFields"
|
||||
},
|
||||
"meta": {
|
||||
"$ref": "fieldMeta.json"
|
||||
}
|
||||
},
|
||||
"required": ["name", "type"]
|
||||
}
|
||||
"required": [
|
||||
"name",
|
||||
"type"
|
||||
]
|
||||
}
|
||||
@@ -413,6 +413,171 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$ref": "#/definitions/minimum",
|
||||
"patternProperties": {
|
||||
"^x-.*|widget|pagebuilder$": {
|
||||
"$comment": "stub for allOf"
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"properties": {
|
||||
"widget": {
|
||||
"enum": [
|
||||
"pagebuilder",
|
||||
"pageBuilder"
|
||||
]
|
||||
},
|
||||
"pagebuilder": {
|
||||
"type": "object",
|
||||
"description": "Pagebuilder widget configuration. Field-level settings override collection-level fallbacks.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"mode": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"overlay",
|
||||
"inline",
|
||||
"both"
|
||||
],
|
||||
"description": "[Planned] Editor mode. Currently only 'overlay' is implemented. 'inline' and 'both' are planned."
|
||||
},
|
||||
"defaultViewport": {
|
||||
"type": "number",
|
||||
"description": "Default viewport width in pixels for the preview. Common presets: 1280 (Desktop), 768 (Tablet), 375 (Phone). Default: 1280. Overrides collection-level fallback."
|
||||
},
|
||||
"blockTypeField": {
|
||||
"type": "string",
|
||||
"description": "Name of the sub-field that holds the block type identifier. Default: 'blockType'. Overrides collection-level fallback."
|
||||
},
|
||||
"blockRegistry": {
|
||||
"type": "object",
|
||||
"description": "Block registry configuration for loading available block definitions.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "URL to an ES module that default-exports a BlockRegistry (Record<string, BlockDefinition>). Overrides collection-level fallback."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$ref": "#/definitions/minimum",
|
||||
"patternProperties": {
|
||||
"^x-.*|widget|pagebuilder$": {
|
||||
"$comment": "stub for allOf"
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"properties": {
|
||||
"widget": {
|
||||
"enum": [
|
||||
"pagebuilder",
|
||||
"pageBuilder"
|
||||
]
|
||||
},
|
||||
"pagebuilder": {
|
||||
"type": "object",
|
||||
"description": "Pagebuilder widget configuration. Field-level settings override collection-level fallbacks.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"mode": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"overlay",
|
||||
"inline",
|
||||
"both"
|
||||
],
|
||||
"description": "[Planned] Editor mode. Currently only 'overlay' is implemented. 'inline' and 'both' are planned."
|
||||
},
|
||||
"defaultViewport": {
|
||||
"type": "number",
|
||||
"description": "Default viewport width in pixels for the preview. Common presets: 1280 (Desktop), 768 (Tablet), 375 (Phone). Default: 1280. Overrides collection-level fallback."
|
||||
},
|
||||
"blockTypeField": {
|
||||
"type": "string",
|
||||
"description": "Name of the sub-field that holds the block type identifier. Default: 'blockType'. Overrides collection-level fallback."
|
||||
},
|
||||
"blockRegistry": {
|
||||
"type": "object",
|
||||
"description": "Block registry configuration for loading available block definitions.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "URL to an ES module that default-exports a BlockRegistry (Record<string, BlockDefinition>). Overrides collection-level fallback."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$ref": "#/definitions/minimum",
|
||||
"patternProperties": {
|
||||
"^x-.*|widget|pagebuilder$": {
|
||||
"$comment": "stub for allOf"
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"properties": {
|
||||
"widget": {
|
||||
"enum": [
|
||||
"pagebuilder",
|
||||
"pageBuilder"
|
||||
]
|
||||
},
|
||||
"pagebuilder": {
|
||||
"type": "object",
|
||||
"description": "Pagebuilder widget configuration. Field-level settings override collection-level fallbacks.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"mode": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"overlay",
|
||||
"inline",
|
||||
"both"
|
||||
],
|
||||
"description": "[Planned] Editor mode. Currently only 'overlay' is implemented. 'inline' and 'both' are planned."
|
||||
},
|
||||
"defaultViewport": {
|
||||
"type": "number",
|
||||
"description": "Default viewport width in pixels for the preview. Common presets: 1280 (Desktop), 768 (Tablet), 375 (Phone). Default: 1280. Overrides collection-level fallback."
|
||||
},
|
||||
"blockTypeField": {
|
||||
"type": "string",
|
||||
"description": "Name of the sub-field that holds the block type identifier. Default: 'blockType'. Overrides collection-level fallback."
|
||||
},
|
||||
"blockRegistry": {
|
||||
"type": "object",
|
||||
"description": "Block registry configuration for loading available block definitions.",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "URL to an ES module that default-exports a BlockRegistry (Record<string, BlockDefinition>). Overrides collection-level fallback."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"definitions": {
|
||||
@@ -721,18 +886,27 @@
|
||||
"type": "boolean"
|
||||
},
|
||||
"size": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "string"
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "shorthand: single size for all breakpoints (e.g. col-3)"
|
||||
},
|
||||
"small": {
|
||||
"type": "string"
|
||||
},
|
||||
"large": {
|
||||
"type": "string"
|
||||
{
|
||||
"type": "object",
|
||||
"description": "responsive sizes per breakpoint",
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "string"
|
||||
},
|
||||
"small": {
|
||||
"type": "string"
|
||||
},
|
||||
"large": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -794,6 +968,62 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget": {
|
||||
"type": "string",
|
||||
"description": "widget type for rendering the field in admin UI"
|
||||
},
|
||||
"position": {
|
||||
"type": "string",
|
||||
"description": "field position in the editor layout: 'main' (default), 'sidebar' (default settings card), or 'sidebar:<group>' (named sidebar card, e.g. 'sidebar:SEO')"
|
||||
},
|
||||
"section": {
|
||||
"description": "section grouping for the field in the editor",
|
||||
"$ref": "definitions.json#/definitions/i18nString"
|
||||
},
|
||||
"choices": {
|
||||
"description": "choices for select/chipArray/checkboxArray widgets",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object"
|
||||
}
|
||||
]
|
||||
},
|
||||
"foreign": {
|
||||
"type": "object",
|
||||
"description": "foreign key configuration for foreignKey/foreignFile widgets"
|
||||
},
|
||||
"downscale": {
|
||||
"type": "object",
|
||||
"description": "image downscale configuration for file/image widgets",
|
||||
"properties": {
|
||||
"maxWidth": {
|
||||
"type": "number",
|
||||
"description": "maximum width in pixels"
|
||||
},
|
||||
"maxHeight": {
|
||||
"type": "number",
|
||||
"description": "maximum height in pixels"
|
||||
},
|
||||
"quality": {
|
||||
"type": "number",
|
||||
"description": "JPEG quality (0-100)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"drillDown": {
|
||||
"type": "boolean",
|
||||
"description": "whether object subFields should be rendered inline (false) or as drill-down navigation (true, default)"
|
||||
},
|
||||
"readonly": {
|
||||
"type": "boolean",
|
||||
"description": "if true, the field is displayed as a read-only view (table/card style) instead of an editable widget. Use inputProps for a disabled input instead."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -841,4 +1071,4 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "JSON Schema tibi-server hooks configuration",
|
||||
"description": "tibi-server hooks linter",
|
||||
"description": "tibi-server hooks configuration",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"patternProperties": {
|
||||
@@ -22,6 +22,10 @@
|
||||
"return": {
|
||||
"description": "hook before returning entries read from database",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"file": {
|
||||
"description": "hook for file download requests (GET /collection/:id/:field/*path)",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -45,6 +49,14 @@
|
||||
"return": {
|
||||
"description": "hook before returning result (after database write)",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkCreate": {
|
||||
"description": "hook for bulk create (POST with JSON array) — optimised single-DB-call path",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkReturn": {
|
||||
"description": "hook before returning bulk create result",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -68,6 +80,14 @@
|
||||
"return": {
|
||||
"description": "hook before returning result (after database write)",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkUpdate": {
|
||||
"description": "hook for bulk update (PUT without ID) — optimised single-DB-call path",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkReturn": {
|
||||
"description": "hook before returning bulk update result",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -83,6 +103,25 @@
|
||||
"return": {
|
||||
"description": "hook before returning result (after database write)",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkDelete": {
|
||||
"description": "hook for bulk delete (DELETE without ID) — optimised single-DB-call path",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
},
|
||||
"bulkReturn": {
|
||||
"description": "hook before returning bulk delete result",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"type": "object",
|
||||
"description": "hooks for audit log entries",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"return": {
|
||||
"description": "hook before returning audit log entries for this collection, can be used to remove sensitive fields from snapshots",
|
||||
"$ref": "#/definitions/hookDef"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,6 +136,10 @@
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "location of javascript hook file relative to config.yml base"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "integer",
|
||||
"description": "execution timeout in seconds"
|
||||
}
|
||||
},
|
||||
"required": ["type", "file"]
|
||||
|
||||
@@ -52,18 +52,48 @@
|
||||
"enum": [
|
||||
"lanczos",
|
||||
"nearestNeighbor",
|
||||
"hermite",
|
||||
"linear",
|
||||
"catmullRom"
|
||||
"catmullRom",
|
||||
"box",
|
||||
"mitchellNetravili",
|
||||
"bSpline",
|
||||
"gaussian",
|
||||
"bartlett",
|
||||
"hann",
|
||||
"hamming",
|
||||
"blackman",
|
||||
"welch",
|
||||
"cosine"
|
||||
]
|
||||
},
|
||||
"anchor": {
|
||||
"enum": [
|
||||
"center",
|
||||
"topLeft",
|
||||
"top",
|
||||
"topRight",
|
||||
"left",
|
||||
"right",
|
||||
"bottomLeft",
|
||||
"bottom",
|
||||
"bottomRight"
|
||||
]
|
||||
},
|
||||
"quality": {
|
||||
"type": "number"
|
||||
},
|
||||
"lossless": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"skipLargerDimension": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"skipLargerFilesize": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"outputType": {
|
||||
"enum": ["jpg", "jpeg", "png", "webp"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
"file": {
|
||||
"type": "string",
|
||||
"description": "javascript file relative to config.yml"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "integer",
|
||||
"description": "execution timeout in seconds"
|
||||
}
|
||||
},
|
||||
"required": ["type", "file"]
|
||||
|
||||
@@ -38,14 +38,85 @@
|
||||
"description": "permissions for http methods",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"get": { "type": "boolean" },
|
||||
"post": { "type": "boolean" },
|
||||
"put": { "type": "boolean" },
|
||||
"delete": { "type": "boolean" }
|
||||
"get": {
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": { "type": "boolean", "description": "Allow GET." }
|
||||
},
|
||||
"required": ["allow"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": { "type": "boolean", "description": "Allow single-document POST." },
|
||||
"bulk": { "type": "boolean", "description": "Allow bulk POST (JSON array body)." }
|
||||
},
|
||||
"required": ["allow"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": { "type": "boolean", "description": "Allow single-document PUT." },
|
||||
"bulk": { "type": "boolean", "description": "Allow bulk PUT (without ID)." }
|
||||
},
|
||||
"required": ["allow"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"oneOf": [
|
||||
{ "type": "boolean" },
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"allow": { "type": "boolean", "description": "Allow single-document DELETE." },
|
||||
"bulk": { "type": "boolean", "description": "Allow bulk DELETE (without ID)." }
|
||||
},
|
||||
"required": ["allow"],
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"validProjections": {
|
||||
"type": "array",
|
||||
"description": "list of projection names this permission set is allowed to use",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"filter": {
|
||||
"type": "object",
|
||||
"description": "MongoDB filter applied to all queries for this permission set",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"readonlyFields": {
|
||||
"type": "array",
|
||||
"description": "fields that are read-only for this permission set",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"hiddenFields": {
|
||||
"type": "array",
|
||||
"description": "fields that are hidden for this permission set",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user