{ "$schema": "https://json-schema.org/draft/2019-09/schema", "$id": "./courses.schema.json", "title": "Pingers", "description": "The data store for the pinger definitions for the bot", "type": "object", "definitions": { "commonProps": { "type": "object", "properties": { "subj": { "type": "string" }, "crsno": { "type": "string" }, "metadata": { "type": "object", "properties": { "user": { "type": "object", "patternProperties": { "^\\d+$": { "$comment": "key is user ID, value is sections to ping for", "type": "object", "patternProperties": { "^\\w{4} \\d{3}[A-Z]? \\w{3}$": { "$comment": "key is section ID, value is status types to ping for", "type": "array", "items": { "type": "string", "enum": ["Available", "Restricted", "Blocked", "Full"] } } }, "additionalProperties": false }, "additionalProperties": false } }, "courses": { "type": "array", "items": { "type": "string", "$comment": "same pattern as section ID in metadata.user", "pattern": "^\\w{4} \\d{3}[A-Z]? \\w{3}$" } } } }, "sessyr": { "type": "string", "pattern": "^\\d{4}$" }, "sesscd": { "type": "string", "pattern": "^[WS]$" } }, "$comment": "technically sessyr and sesscd is not required, but in practice it will get populated during add_ping", "required": [ "subj", "crsno", "metadata" ] }, "searchModeProps": { "allOf": [ { "$ref": "#/definitions/commonProps" } ], "type": "object", "$comment": "all of the properties are technically optional, but in practice it is always populated; days are separate keys each, but technically should all be true or else it wouldn't be defined even though false is also accepted", "properties": { "credit": { "type": "string" }, "sTime": { "type": "string" }, "eTime": { "type": "string" }, "actv": { "type": "string" }, "term": { "type": "string" } }, "patternProperties": { "^DAY[1-7]$": { "type": "boolean" } }, "not": { "required": ["section"] } }, "sectionModeProps": { "allOf": [ { "$ref": "#/definitions/commonProps" } ], "type": "object", "properties": { "section": { "oneOf": [ { "type": "string", "$comment": "specifies the section to filter with; should be transient and change to true after add_course" }, { "const": true, "$comment": "signify to pinger it is in section mode" } ] } }, "required": [ "section" ] } }, "patternProperties": { "^.*$": { "oneOf": [ { "$ref": "#/definitions/searchModeProps" }, { "$ref": "#/definitions/sectionModeProps" } ], "$comment": "we want a rigid schema so don't allow additional properties (unevaluated to allow for proper composition)", "unevaluatedProperties": false } } }