{
    "id": "http://schemas.triniti.io/json-schema/triniti/curator/mixin/teaser-has-target/1-0-0.json#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "_id": {
            "type": "string",
            "pattern": "^[\\w\\/\\.:-]+$",
            "pbj": {
                "type": "identifier",
                "rule": "single",
                "overridable": true
            }
        },
        "status": {
            "type": "string",
            "default": "draft",
            "enum": [
                "unknown",
                "published",
                "scheduled",
                "pending",
                "draft",
                "expired",
                "archived",
                "deleted"
            ],
            "pbj": {
                "type": "string-enum",
                "rule": "single"
            }
        },
        "etag": {
            "type": "string",
            "pattern": "^[\\w\\.:-]+$",
            "pbj": {
                "type": "string",
                "rule": "single"
            }
        },
        "created_at": {
            "type": "string",
            "pattern": "^[1-9]{1}[0-9]{12,15}$",
            "pbj": {
                "type": "microtime",
                "rule": "single"
            }
        },
        "creator_ref": {
            "type": "object",
            "properties": {
                "curie": {
                    "type": "string",
                    "pattern": "^([a-z0-9-]+):([a-z0-9\\.-]+):([a-z0-9-]+)?:([a-z0-9-]+)$",
                    "minLength": 0,
                    "maxLength": 146
                },
                "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9:_\\-]+$",
                    "minLength": 0,
                    "maxLength": 255
                },
                "tag": {
                    "type": "string",
                    "pattern": "^([\\w\\/-]|[\\w-][\\w\\/-]*[\\w-])$",
                    "minLength": 0,
                    "maxLength": 255
                }
            },
            "required": [
                "curie",
                "id"
            ],
            "additionalProperties": false,
            "description": "A fully qualified reference to what created this node. This is intentionally a message-ref and not a user id because it is often a program that creates nodes, not a user.",
            "pbj": {
                "type": "message-ref",
                "rule": "single"
            }
        },
        "updated_at": {
            "type": "string",
            "pattern": "^[1-9]{1}[0-9]{12,15}$",
            "pbj": {
                "type": "microtime",
                "rule": "single",
                "useTypeDefault": false
            }
        },
        "updater_ref": {
            "type": "object",
            "properties": {
                "curie": {
                    "type": "string",
                    "pattern": "^([a-z0-9-]+):([a-z0-9\\.-]+):([a-z0-9-]+)?:([a-z0-9-]+)$",
                    "minLength": 0,
                    "maxLength": 146
                },
                "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9:_\\-]+$",
                    "minLength": 0,
                    "maxLength": 255
                },
                "tag": {
                    "type": "string",
                    "pattern": "^([\\w\\/-]|[\\w-][\\w\\/-]*[\\w-])$",
                    "minLength": 0,
                    "maxLength": 255
                }
            },
            "required": [
                "curie",
                "id"
            ],
            "additionalProperties": false,
            "description": "A fully qualified reference to what updated this node. This is intentionally a message-ref and not a user id because it is often a program that updates nodes, not a user. E.g. \"acme:iam:node:app:cli-scheduler\" or \"acme:iam:node:user:60c71df0-fda8-11e5-bfb9-30342d363854\"",
            "pbj": {
                "type": "message-ref",
                "rule": "single"
            }
        },
        "last_event_ref": {
            "type": "object",
            "properties": {
                "curie": {
                    "type": "string",
                    "pattern": "^([a-z0-9-]+):([a-z0-9\\.-]+):([a-z0-9-]+)?:([a-z0-9-]+)$",
                    "minLength": 0,
                    "maxLength": 146
                },
                "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9:_\\-]+$",
                    "minLength": 0,
                    "maxLength": 255
                },
                "tag": {
                    "type": "string",
                    "pattern": "^([\\w\\/-]|[\\w-][\\w\\/-]*[\\w-])$",
                    "minLength": 0,
                    "maxLength": 255
                }
            },
            "required": [
                "curie",
                "id"
            ],
            "additionalProperties": false,
            "description": "A reference to the last event that changed the state of this node. E.g. \"acme:blog:event:article-published:60c71df0-fda8-11e5-bfb9-30342d363854\"",
            "pbj": {
                "type": "message-ref",
                "rule": "single"
            }
        },
        "title": {
            "type": "string",
            "minLength": 0,
            "maxLength": 255,
            "pbj": {
                "type": "string",
                "rule": "single"
            }
        },
        "order_date": {
            "type": "string",
            "format": "date-time",
            "description": "Determines the sequence that this teaser node will be rendered in lists, search results, etc. It DOES NOT control visibility or publishing. A date was used over an integer (e.g. seq_no) for blog-like, reverse chronological, clarity in sorting.",
            "pbj": {
                "type": "date-time",
                "rule": "single"
            }
        },
        "slotting": {
            "type": "object",
            "patternProperties": {
                "^[a-zA-Z_]{1}[\\w\\.:-]+$": {
                    "type": "integer",
                    "default": 0,
                    "minimum": 0,
                    "maximum": 255
                }
            },
            "additionalProperties": false,
            "description": "A map of integers, e.g. {home: 1, sports: 5, tv: 9}, that determine where teasers will render in lists that use slotting. We call it slotting vs sticky or pinning as that is generally just one at a time.",
            "pbj": {
                "type": "tiny-int",
                "rule": "map"
            }
        },
        "image_ref": {
            "type": "string",
            "pattern": "^[\\w\\/\\.:-]+$",
            "description": "A reference to the image asset to use for widgets, sharing, seo.",
            "pbj": {
                "type": "identifier",
                "rule": "single"
            }
        },
        "description": {
            "type": "string",
            "minLength": 0,
            "maxLength": 5000,
            "description": "A description of the teaser (usually a few sentences). It should typically not have HTML as it is used in metadata, feeds, SERP and social.",
            "pbj": {
                "type": "text",
                "rule": "single"
            }
        },
        "caption": {
            "type": "string",
            "minLength": 0,
            "maxLength": 255,
            "description": "Text to be used to caption the teaser.",
            "pbj": {
                "type": "string",
                "rule": "single"
            }
        },
        "cta_text": {
            "type": "string",
            "minLength": 0,
            "maxLength": 255,
            "description": "Text to be used for the call to action.",
            "pbj": {
                "type": "string",
                "rule": "single"
            }
        },
        "credit": {
            "type": "string",
            "minLength": 0,
            "maxLength": 255,
            "description": "Text to be used to credit the teaser source.",
            "pbj": {
                "type": "string",
                "rule": "single"
            }
        },
        "credit_url": {
            "type": "string",
            "pattern": "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$",
            "description": "URL to be used to link to the teaser source.",
            "pbj": {
                "type": "text",
                "rule": "single",
                "format": "url"
            }
        },
        "gallery_ref": {
            "type": "string",
            "pattern": "^[\\w\\/\\.:-]+$",
            "pbj": {
                "type": "identifier",
                "rule": "single"
            }
        },
        "timeline_ref": {
            "type": "string",
            "pattern": "^[\\w\\/\\.:-]+$",
            "pbj": {
                "type": "identifier",
                "rule": "single"
            }
        },
        "target_ref": {
            "type": "string",
            "pattern": "^[\\w\\/\\.:-]+$",
            "description": "A reference to the target teaserable node this teaser is bound to.",
            "pbj": {
                "type": "identifier",
                "rule": "single"
            }
        },
        "sync_with_target": {
            "type": "boolean",
            "description": "When true this teaser will automatically be updated to match the target it is bound to whenever the target is modified.",
            "pbj": {
                "type": "boolean",
                "rule": "single"
            }
        }
    },
    "required": [
        "_id",
        "target_ref"
    ],
    "additionalProperties": true
}