{
  "$schema" : "https://json-schema.org/draft/2019-09/schema#",
  "$id" : "https://purl.1edtech.org/spec/eduapi/v1p0/schema/json/eduapi_v1p0_collectiontemplate-jsonschema1.json",
  "title" : "JSON Schema for the CollectionTemplate class.",
  "description" : "A grouping of educational units. In the context of Edu-API an education is any kind of canonical or non-instantiated learning units that have a structured relationship, e.g. a course. When grouped, these educational units can be used to define such concepts as programs of study.",
  "type" : "object",
  "properties" : {
    "collectionType" : {
      "description" : "A representation of what the entity defines. It is based on an extensible enumerated vocabulary.",
      "$comment" : "Origin: CollectionTypeEnum (EnumExt); The set of permitted values for `collectionType`.",
      "oneOf" : [ {
        "type" : "string",
        "enum" : [ "program", "generalEducation", "requiredCollection", "electiveCollection", "capstoneCollection", "majorCollection", "minorCollection", "programSpecialization", "nonDegreeCollection" ]
      }, {
        "type" : "string",
        "pattern" : "(ext:)[a-z|A-Z|0-9|.|-|_]+"
      } ]
    },
    "parent" : {
      "type" : "array",
      "items" : {
        "description" : "A reference to a parent CollectionTemplate.",
        "$comment" : "Origin: CollectionTemplateGUIDRef (DerivedType); A reference to an `EducationCollection` object that has an allocated sourcedId (`GUID`).",
        "type" : "string"
      }
    },
    "sourcedId" : {
      "description" : "The sourcedId of the object. This is the interoperability identifier that systems will refer to when making API calls, or when needing to identify an object. Systems SHOULD be able to map whichever local ids (e.g. database key fields) they use to sourcedId. The sourcedId of an object MUST be an anonymized or pseudonymized identifier of an entity and as such will not contain Personally Identifiable Information (PII) or Personal Data (PD).",
      "$comment" : "Origin: GUID (DerivedType); The data-type for establishing a Globally Unique Identifier (GUID). There is no predefined structure for the GUID.",
      "type" : "string"
    },
    "recordLanguage" : {
      "description" : "The primary language used in the described entity.",
      "$comment" : "Origin: LanguageCode (DerivedType); A language code [[BCP47]].",
      "type" : "string",
      "pattern" : "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
    },
    "title" : {
      "type" : "array",
      "minItems" : 1,
      "items" : {
        "$ref" : "#/$defs/LanguageTypedString"
      }
    },
    "description" : {
      "type" : "array",
      "minItems" : 1,
      "items" : {
        "$ref" : "#/$defs/LanguageTypedString"
      }
    },
    "primaryCode" : {
      "$ref" : "#/$defs/IdentifierEntry"
    },
    "otherCodes" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/$defs/IdentifierEntry"
      }
    },
    "subjectCodes" : {
      "type" : "array",
      "items" : {
        "description" : "The set of subjects, represented by codes that this education addresses",
        "$comment" : "Origin: String (PrimitiveType); Character strings.",
        "type" : "string"
      }
    },
    "organization" : {
      "description" : "A reference to an Edu-API Organization.",
      "$comment" : "Origin: OrganizationGUIDRef (DerivedType); A reference to an `Organization` object that has an allocated sourcedId (`GUID`).",
      "type" : "string"
    },
    "organizationCode" : {
      "description" : "A business code that a system might use to reference an organization. This value is provided for convenience and should match the value in organization.primaryCode. This attribute was added as a convenience shorthand for organization.primaryCode.",
      "$comment" : "Origin: String (PrimitiveType); Character strings.",
      "type" : "string"
    },
    "level" : {
      "description" : "The educational level that the entity is for. This is represented by an extensible enumerated vocabulary and commonly varies by institution and region.",
      "$comment" : "Origin: EducationLevelEnum (EnumExt); The set of permitted values for `educationLevel`.",
      "oneOf" : [ {
        "type" : "string",
        "enum" : [ "graduate", "undergraduate", "doctoral" ]
      }, {
        "type" : "string",
        "pattern" : "(ext:)[a-z|A-Z|0-9|.|-|_]+"
      } ]
    },
    "creditType" : {
      "description" : "Reference to what the completion of this entity counts towards. This is represented by an extensible enumerated vocabulary.",
      "$comment" : "Origin: CreditTypeEnum (EnumExt); The set of permitted values for `creditType`.",
      "oneOf" : [ {
        "type" : "string",
        "enum" : [ "credit", "nonCredit" ]
      }, {
        "type" : "string",
        "pattern" : "(ext:)[a-z|A-Z|0-9|.|-|_]+"
      } ]
    },
    "creditsAwarded" : {
      "description" : "A description of the credits that the student receives after the completion of the education.",
      "$comment" : "Origin: String (PrimitiveType); Character strings.",
      "type" : "string"
    },
    "gradingScheme" : {
      "type" : "array",
      "minItems" : 1,
      "items" : {
        "$ref" : "#/$defs/LanguageTypedString"
      }
    },
    "teachingLanguage" : {
      "description" : "The main language used to deliver the content of the education.",
      "$comment" : "Origin: LanguageCode (DerivedType); A language code [[BCP47]].",
      "type" : "string",
      "pattern" : "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
    },
    "recordStatus" : {
      "description" : "The status of this record. This value reflects the state of the record itself, not the status of the real-world entity or resource it represents. A record with a status of deleted indicates that it has been marked for removal and may be safely deleted by consuming systems. Systems may choose to remove such records, but are not required to do so",
      "$comment" : "Origin: RecordStatusTypeEnum (Enum); The set of values to describe the state of a record in the source system. For systems migrating from, or making use of OneRoster, deleted is to be considered synonymous with toBeDeleted.",
      "type" : "string",
      "enum" : [ "active", "deleted", "inactive" ]
    },
    "dateLastModified" : {
      "description" : "A timestamp describing when this record was last modified.",
      "$comment" : "Origin: DateTimeZ (DerivedType); A `DateTime` with the trailing timezone specifier included, e.g. `2021-09-07T02:09:59+02:00`",
      "type" : "string",
      "format" : "date-time"
    },
    "extensions" : {
      "$ref" : "#/$defs/educationExtensions"
    },
    "learningObjectiveSet" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/$defs/LearningObjectiveSet"
      }
    }
  },
  "required" : [ "collectionType", "sourcedId", "recordLanguage", "title", "description", "primaryCode", "organization", "level", "creditType", "gradingScheme", "recordStatus" ],
  "additionalProperties" : false,
  "$defs" : {
    "LearningObjectiveSet" : {
      "description" : "This is the container for the set of learning objective identifiers that are from a single source responsible for creating those identifiers.",
      "type" : "object",
      "properties" : {
        "sourcedId" : {
          "description" : "The sourcedId of the object. This is the interoperability identifier that systems will refer to when making API calls, or when needing to identify an object. Systems SHOULD be able to map whichever local ids (e.g. database key fields) they use to sourcedId. The sourcedId of an object MUST be an anonymized or pseudonymized identifier of an entity and as such will not contain Personally Identifiable Information (PII) or Personal Data (PD).",
          "$comment" : "Origin: GUID (DerivedType); The data-type for establishing a Globally Unique Identifier (GUID). There is no predefined structure for the GUID.",
          "type" : "string"
        },
        "recordLanguage" : {
          "description" : "The primary language used in the described entity.",
          "$comment" : "Origin: LanguageCode (DerivedType); A language code [[BCP47]].",
          "type" : "string",
          "pattern" : "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
        },
        "recordStatus" : {
          "description" : "The status of this record. The record has been, or will immediately be, removed from the upstream system; downstream systems can also remove this record as it won't be used again.",
          "$comment" : "Origin: RecordStatusTypeEnum (Enum); The set of values to describe the state of a record in the source system. For systems migrating from, or making use of OneRoster, deleted is to be considered synonymous with toBeDeleted.",
          "type" : "string",
          "enum" : [ "active", "deleted", "inactive" ]
        },
        "dateLastModified" : {
          "description" : "A timestamp describing when this record was last modified.",
          "$comment" : "Origin: DateTimeZ (DerivedType); A `DateTime` with the trailing timezone specifier included, e.g. `2021-09-07T02:09:59+02:00`",
          "type" : "string",
          "format" : "date-time"
        },
        "extensions" : {
          "$ref" : "#/$defs/learningObjectiveSetExtensions"
        },
        "source" : {
          "description" : "The source responsible for creating the learning objective identifiers. The permitted values are from an extensible vocabulary.",
          "$comment" : "Origin: SourceExtEnum (EnumExt); The predefined vocabulary for the source that was responsible for creating the learning objective identifiers.",
          "oneOf" : [ {
            "type" : "string",
            "enum" : [ "case", "unknown", "CTDL-ASN" ]
          }, {
            "type" : "string",
            "pattern" : "(ext:)[a-z|A-Z|0-9|.|-|_]+"
          } ]
        },
        "learningObjectiveIds" : {
          "type" : "array",
          "minItems" : 1,
          "items" : {
            "description" : "The set of unique identifiers for the associated learning objectives. If these are CASE identifiers they MUST be valid UUIDs.",
            "$comment" : "Origin: NormalizedString (PrimitiveType); A `String` conforming to the `normalizedString` definition in [[XMLSCHEMA11-2]].",
            "type" : "string"
          }
        }
      },
      "required" : [ "sourcedId", "recordLanguage", "recordStatus", "source", "learningObjectiveIds" ],
      "additionalProperties" : false
    },
    "IdentifierEntry" : {
      "description" : "A container to transmit additional needed identifiers",
      "type" : "object",
      "properties" : {
        "identifier" : {
          "description" : "An identifier.",
          "$comment" : "Origin: Identifier (DerivedType); A `NormalizedString` that functions as an identifier.",
          "type" : "string"
        },
        "identifierType" : {
          "description" : "The identifier type.",
          "$comment" : "Origin: IdentifierTypeEnum (EnumExt); The set of permitted values for `identifierType`.",
          "oneOf" : [ {
            "type" : "string",
            "enum" : [ "systemId", "productId", "userName", "accountId", "emailAddress", "nationalIdentityNumber", "isbn", "issn", "lisSourcedId", "oneRosterSourcedId", "sisSourcedId", "ltiContextId", "ltiDeploymentId", "ltiToolId", "ltiPlatformId", "ltiUserId", "identifier" ]
          }, {
            "type" : "string",
            "pattern" : "(ext:)[a-z|A-Z|0-9|.|-|_]+"
          } ]
        }
      },
      "required" : [ "identifier", "identifierType" ],
      "additionalProperties" : false
    },
    "learningObjectiveSetExtensions" : {
      "description" : "Extension properties related Learning Objective Sets",
      "type" : "object",
      "properties" : { },
      "required" : [ ],
      "additionalProperties" : true
    },
    "LanguageTypedString" : {
      "description" : "A String with an associated language code.",
      "type" : "object",
      "properties" : {
        "recordLanguage" : {
          "description" : "The primary language used in the described entity.",
          "$comment" : "Origin: LanguageCode (DerivedType); A language code [[BCP47]].",
          "type" : "string",
          "pattern" : "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$"
        },
        "value" : {
          "description" : "The string value.",
          "$comment" : "Origin: String (PrimitiveType); Character strings.",
          "type" : "string"
        }
      },
      "required" : [ "recordLanguage", "value" ],
      "additionalProperties" : false
    },
    "educationExtensions" : {
      "description" : "Extension properties related to education templates",
      "type" : "object",
      "properties" : { },
      "required" : [ ],
      "additionalProperties" : true
    }
  }
}