diff --git a/openapi/occapi_v2.yaml b/openapi/occapi_v2.yaml index d134dea..adbbab5 100644 --- a/openapi/occapi_v2.yaml +++ b/openapi/occapi_v2.yaml @@ -1,6 +1,6 @@ openapi: 3.1.0 info: - version: 2.0.0-dev + version: 2.0.0-alpha title: Open Course Catalogue API termsOfService: '' contact: @@ -13,14 +13,11 @@ info: url: 'https://uni-foundation.eu/wp-content/uploads/2019/04/EUF-1.png' description: $ref: ./v2/info-description.md -# externalDocs: -# description: Find out how to create a GitHub repo for your OpenAPI definition. -# url: 'https://github.com/Rebilly/generator-openapi-repo' tags: - - name: API provider - description: Information about the provider. + - name: API server + description: Information about the server. - name: Institution - description: Information about the Institutions covered by the provider. + description: Information about the Institutions covered by the server. - name: Organisational Unit description: Information about Organisational Units in an Institution. - name: Programme @@ -30,41 +27,45 @@ tags: Information about Courses offered by an Institution. _Course_ resources include a JSON:API _meta_ object containing information - about the relation between each Course and all or specific Programmes. - # - name: Tag + about the relation between each Course and specific Programmes. + - name: Course instance + description: | + Information about instances of Courses offered by an Institution. + + _Course instance_ resources are directly linked to _Course_ resources. servers: - url: '/occapi/v2' description: Sandbox server (example data) paths: /: - $ref: paths/root.yaml + $ref: v2/paths/root.yaml # Institution & Organisational Unit endpoints. /hei: - $ref: paths/hei.yaml + $ref: v2/paths/hei.yaml '/hei/{heiId}': - $ref: 'paths/hei@{heiId}.yaml' + $ref: 'v2/paths/hei@{heiId}.yaml' '/hei/{heiId}/ounit': - $ref: 'paths/ounit.yaml' + $ref: 'v2/paths/ounit.yaml' '/hei/{heiId}/ounit/{id}': - $ref: 'paths/ounit@{id}.yaml' + $ref: 'v2/paths/ounit@{id}.yaml' # Programme endpoints. '/hei/{heiId}/programme': - $ref: 'paths/programme.yaml' + $ref: 'v2/paths/programme.yaml' '/hei/{heiId}/ounit/{id}/programme': - $ref: 'paths/ounit@{id}-programme.yaml' + $ref: 'v2/paths/ounit@{id}-programme.yaml' '/hei/{heiId}/programme/{id}': - $ref: 'paths/programme@{id}.yaml' + $ref: 'v2/paths/programme@{id}.yaml' # Course endpoints. '/hei/{heiId}/course': - $ref: 'paths/course.yaml' + $ref: 'v2/paths/course.yaml' '/hei/{heiId}/ounit/{id}/course': - $ref: 'paths/ounit@{id}-course.yaml' + $ref: 'v2/paths/ounit@{id}-course.yaml' '/hei/{heiId}/programme/{id}/course': - $ref: 'paths/programme@{id}-course.yaml' + $ref: 'v2/paths/programme@{id}-course.yaml' '/hei/{heiId}/course/{id}': - $ref: 'paths/course@{id}.yaml' - # Exanples - # '/path': - # $ref: 'paths/path-item.yaml' - # '/path/example': - # $ref: 'paths/path-item-with-examples.yaml' + $ref: 'v2/paths/course@{id}.yaml' + # Course instance endpoints. + '/hei/{heiId}/course/{id}/instance': + $ref: 'v2/paths/course@{id}-instance.yaml' + '/hei/{heiId}/instance/{id}': + $ref: 'v2/paths/instance@{id}.yaml' diff --git a/openapi/v2/components/README.md b/openapi/v2/components/README.md new file mode 100644 index 0000000..26eaeb5 --- /dev/null +++ b/openapi/v2/components/README.md @@ -0,0 +1,14 @@ +Reusable components +=========== + +* You can create the following folders here: + - `schemas` - reusable [Schema Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject) + - `responses` - reusable [Response Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject) + - `parameters` - reusable [Parameter Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject) + - `examples` - reusable [Example Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject) + - `headers` - reusable [Header Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject) + - `requestBodies` - reusable [Request Body Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject) + - `links` - reusable [Link Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject) + - `callbacks` - reusable [Callback Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject) + - `securitySchemes` - reusable [Security Scheme Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject) +* Filename of files inside the folders represent component name, e.g. `Customer.yaml` diff --git a/openapi/v2/components/headers/ExpiresAfter.yaml b/openapi/v2/components/headers/ExpiresAfter.yaml new file mode 100644 index 0000000..0cbe9a5 --- /dev/null +++ b/openapi/v2/components/headers/ExpiresAfter.yaml @@ -0,0 +1,4 @@ +description: date in UTC when token expires +schema: + type: string + format: date-time diff --git a/openapi/v2/components/responses/CourseCollection.yaml b/openapi/v2/components/responses/CourseCollection.yaml new file mode 100644 index 0000000..18ddf4c --- /dev/null +++ b/openapi/v2/components/responses/CourseCollection.yaml @@ -0,0 +1,76 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: course + id: aabbccdd-eeff-1122-3344-556677889900 + attributes: + title: + - string: Example Course + lang: en + code: COUR01 + ects: 7.5 + academicTerm: + - '1/2' + description: + - multiline: | + This is the description of the Course. + + This is a long text field. + lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Course. + + This is a long text field. + lang: en + localClassification: + - classificationSystem: 'erasmus' + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true + url: + - uri: www.domain.tld/example/course + lang: en + lastModified: 2025-09-01T12:00:00Z + deprecated: false + meta: + relatedProgramme: + - programmeId: abcdef12-3456-7890-abcd-ef1234567890 + mandatoryCourse: true + year: '1/2' + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + instance: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course' diff --git a/openapi/v2/components/responses/CourseInstanceCollection.yaml b/openapi/v2/components/responses/CourseInstanceCollection.yaml new file mode 100644 index 0000000..51a55ea --- /dev/null +++ b/openapi/v2/components/responses/CourseInstanceCollection.yaml @@ -0,0 +1,25 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: instance + id: 13579bdf-0246-8ace-1357-9bdf02468ace + attributes: + lastModified: 2025-09-01T12:00:00Z + relationships: + course: + data: + type: course + id: aabbccdd-eeff-1122-3344-556677889900 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance' diff --git a/openapi/v2/components/responses/CourseInstanceResource.yaml b/openapi/v2/components/responses/CourseInstanceResource.yaml new file mode 100644 index 0000000..222610b --- /dev/null +++ b/openapi/v2/components/responses/CourseInstanceResource.yaml @@ -0,0 +1,42 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: instance + id: 13579bdf-0246-8ace-1357-9bdf02468ace + attributes: + startDate: 2025-02-01 + endDate: 2025-06-30 + academicTermId: 2025/2026-2/2 + ects: 7.5 + elmAssessmentType: + - 3484bd7e51 + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + engagementHours: 42 + languageOfInstruction: + - en + lastModified: 2025-09-01T12:00:00Z + relationships: + course: + data: + type: course + id: aabbccdd-eeff-1122-3344-556677889900 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace' diff --git a/openapi/v2/components/responses/CourseResource.yaml b/openapi/v2/components/responses/CourseResource.yaml new file mode 100644 index 0000000..7227f1a --- /dev/null +++ b/openapi/v2/components/responses/CourseResource.yaml @@ -0,0 +1,112 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: course + id: aabbccdd-eeff-1122-3344-556677889900 + attributes: + title: + - string: Example Course + lang: en + code: COUR01 + ects: 7.5 + academicTerm: + - '1/2' + description: + - multiline: | + This is the description of the Course. + + This is a long text field. + lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Course. + + This is a long text field. + lang: en + localClassification: + - classificationSystem: 'erasmus' + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true + url: + - uri: www.domain.tld/example/course + lang: en + bibliography: + - multiline: | + This is the bibliography of the Course. + + This is a long text field. + lang: en + courseContent: + - multiline: | + this is the content outline of the Course. + + This is a long text field. + lang: en + prerequisites: + - multiline: | + These are the prerequisites of the Course. + + This is a long text field. + lang: en + courseAvailability: + - multiline: | + These are other factors impacting enrollment in the Course. + + This is a long text field. + lang: en + teachingMethod: + - multiline: | + This is the teaching method for the Course. + + This is a long text field. + lang: en + assessmentMethod: + - multiline: | + This is the assessment method for the Course. + + This is a long text field. + lang: en + lastModified: 2025-09-01T12:00:00Z + deprecated: false + meta: + relatedProgramme: + - programmeId: abcdef12-3456-7890-abcd-ef1234567890 + mandatoryCourse: true + year: '1/2' + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + instance: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' diff --git a/openapi/v2/components/responses/EndpointNotAvailable.yaml b/openapi/v2/components/responses/EndpointNotAvailable.yaml new file mode 100644 index 0000000..d37cdb4 --- /dev/null +++ b/openapi/v2/components/responses/EndpointNotAvailable.yaml @@ -0,0 +1,9 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +errors: + - status: "404" + title: Endpoint not available. diff --git a/openapi/v2/components/responses/InstitutionCollection.yaml b/openapi/v2/components/responses/InstitutionCollection.yaml new file mode 100644 index 0000000..20b721f --- /dev/null +++ b/openapi/v2/components/responses/InstitutionCollection.yaml @@ -0,0 +1,32 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: hei + id: domain.tld + attributes: + title: + - string: Example Institution + lang: en + abbreviation: + - string: EI + heiId: domain.tld + url: + - uri: www.domain.tld + lang: en + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld' + ounit: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit' + programme: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/course' +links: + self: + href: 'http://example.com/occapi/v2/hei' diff --git a/openapi/v2/components/responses/InstitutionResource.yaml b/openapi/v2/components/responses/InstitutionResource.yaml new file mode 100644 index 0000000..9c75dff --- /dev/null +++ b/openapi/v2/components/responses/InstitutionResource.yaml @@ -0,0 +1,32 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: hei + id: domain.tld + attributes: + title: + - string: Example Institution + lang: en + abbreviation: + - string: EI + heiId: domain.tld + url: + - uri: www.domain.tld + lang: en + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld' + ounit: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit' + programme: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld' diff --git a/openapi/v2/components/responses/OunitCollection.yaml b/openapi/v2/components/responses/OunitCollection.yaml new file mode 100644 index 0000000..af52707 --- /dev/null +++ b/openapi/v2/components/responses/OunitCollection.yaml @@ -0,0 +1,31 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: ounit + id: 11223344-5566-7788-9900-aabbccddeeff + attributes: + title: + - string: Example Organisational Unit + lang: en + abbreviation: + - string: EOU + ounitId: 11223344-5566-7788-9900-aabbccddeeff + ounitCode: EI-EOU + url: + - uri: www.domain.tld/eou + lang: en + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff' + programme: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit' diff --git a/openapi/v2/components/responses/OunitCourseCollection.yaml b/openapi/v2/components/responses/OunitCourseCollection.yaml new file mode 100644 index 0000000..37c57d9 --- /dev/null +++ b/openapi/v2/components/responses/OunitCourseCollection.yaml @@ -0,0 +1,76 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: course + id: aabbccdd-eeff-1122-3344-556677889900 + attributes: + title: + - string: Example Course + lang: en + code: COUR01 + ects: 7.5 + academicTerm: + - '1/2' + description: + - multiline: | + This is the description of the Course. + + This is a long text field. + lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Course. + + This is a long text field. + lang: en + localClassification: + - classificationSystem: 'erasmus' + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true + url: + - uri: www.domain.tld/example/course + lang: en + lastModified: 2025-09-01T12:00:00Z + deprecated: false + meta: + relatedProgramme: + - programmeId: abcdef12-3456-7890-abcd-ef1234567890 + mandatoryCourse: true + year: '1/2' + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + instance: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course' diff --git a/openapi/v2/components/responses/OunitProgrammeCollection.yaml b/openapi/v2/components/responses/OunitProgrammeCollection.yaml new file mode 100644 index 0000000..5960cf2 --- /dev/null +++ b/openapi/v2/components/responses/OunitProgrammeCollection.yaml @@ -0,0 +1,55 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + attributes: + title: + - string: Example Programme + lang: en + code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 + description: + - multiline: | + This is the description of the Programme. + + This is a long text field. + lang: en + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 + url: + - uri: www.domain.tld/example/programme + lang: en + validSince: 2020-01-01 + validUntil: 2029-12-31 + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme' diff --git a/openapi/v2/components/responses/OunitResource.yaml b/openapi/v2/components/responses/OunitResource.yaml new file mode 100644 index 0000000..46382ef --- /dev/null +++ b/openapi/v2/components/responses/OunitResource.yaml @@ -0,0 +1,31 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: ounit + id: 11223344-5566-7788-9900-aabbccddeeff + attributes: + title: + - string: Example Organisational Unit + lang: en + abbreviation: + - string: EOU + ounitId: 11223344-5566-7788-9900-aabbccddeeff + ounitCode: EI-EOU + url: + - uri: www.domain.tld/eou + lang: en + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff' + programme: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff' diff --git a/openapi/v2/components/responses/Problem.yaml b/openapi/v2/components/responses/Problem.yaml new file mode 100644 index 0000000..f66a55e --- /dev/null +++ b/openapi/v2/components/responses/Problem.yaml @@ -0,0 +1,5 @@ +description: Problem +content: + application/problem+json: + schema: + $ref: ../schemas/Problem.yaml \ No newline at end of file diff --git a/openapi/v2/components/responses/ProgrammeCollection.yaml b/openapi/v2/components/responses/ProgrammeCollection.yaml new file mode 100644 index 0000000..de2c84b --- /dev/null +++ b/openapi/v2/components/responses/ProgrammeCollection.yaml @@ -0,0 +1,55 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + attributes: + title: + - string: Example Programme + lang: en + code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 + description: + - multiline: | + This is the description of the Programme. + + This is a long text field. + lang: en + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 + url: + - uri: www.domain.tld/example/programme + lang: en + validSince: 2020-01-01 + validUntil: 2029-12-31 + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme' diff --git a/openapi/v2/components/responses/ProgrammeCourseCollection.yaml b/openapi/v2/components/responses/ProgrammeCourseCollection.yaml new file mode 100644 index 0000000..616895a --- /dev/null +++ b/openapi/v2/components/responses/ProgrammeCourseCollection.yaml @@ -0,0 +1,76 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + - type: course + id: aabbccdd-eeff-1122-3344-556677889900 + attributes: + title: + - string: Example Course + lang: en + code: COUR01 + ects: 7.5 + academicTerm: + - '1/2' + description: + - multiline: | + This is the description of the Course. + + This is a long text field. + lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Course. + + This is a long text field. + lang: en + localClassification: + - classificationSystem: 'erasmus' + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true + url: + - uri: www.domain.tld/example/course + lang: en + lastModified: 2025-09-01T12:00:00Z + deprecated: false + meta: + relatedProgramme: + - programmeId: abcdef12-3456-7890-abcd-ef1234567890 + mandatoryCourse: true + year: '1/2' + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900' + instance: + href: 'http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course' diff --git a/openapi/v2/components/responses/ProgrammeResource.yaml b/openapi/v2/components/responses/ProgrammeResource.yaml new file mode 100644 index 0000000..d982672 --- /dev/null +++ b/openapi/v2/components/responses/ProgrammeResource.yaml @@ -0,0 +1,55 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + attributes: + title: + - string: Example Programme + lang: en + code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 + description: + - multiline: | + This is the description of the Programme. + + This is a long text field. + lang: en + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 + url: + - uri: www.domain.tld/example/programme + lang: en + validSince: 2020-01-01 + validUntil: 2029-12-31 + lastModified: 2025-09-01T12:00:00Z + links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' + course: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course' +links: + self: + href: 'http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890' diff --git a/openapi/v2/components/responses/ResourceNotFound.yaml b/openapi/v2/components/responses/ResourceNotFound.yaml new file mode 100644 index 0000000..017fb38 --- /dev/null +++ b/openapi/v2/components/responses/ResourceNotFound.yaml @@ -0,0 +1,9 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +errors: + - status: "404" + title: Resource not found. diff --git a/openapi/v2/components/responses/Root.yaml b/openapi/v2/components/responses/Root.yaml new file mode 100644 index 0000000..86cd9ec --- /dev/null +++ b/openapi/v2/components/responses/Root.yaml @@ -0,0 +1,25 @@ +jsonapi: + version: "1.1" + meta: + links: + self: + href: "http://jsonapi.org/format/1.1/" +data: + type: "server" + id: 12345678-90ab-cdef-1234-567890abcdef + attributes: + serverName: + - string: "Test server" + lang: "en" + - string: "Servidor de testes" + lang: "pt" + termsOfService: [] + links: + self: + href: "http://example.com/occapi/v2" + hei: + href: "http://example.com/occapi/v2/hei" +meta: {} +links: + self: + href: "http://example.com/occapi/v2" diff --git a/openapi/v2/components/schemas/CourseCollection.yaml b/openapi/v2/components/schemas/CourseCollection.yaml new file mode 100644 index 0000000..e755aa9 --- /dev/null +++ b/openapi/v2/components/schemas/CourseCollection.yaml @@ -0,0 +1,25 @@ +type: object +description: JSON:API collection of _Course_ resources. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: array + description: List of _Course_ resources. + items: + type: object + required: + - type + - id + - attributes + - links + properties: + $ref: ./CourseData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksCollection.yaml diff --git a/openapi/v2/components/schemas/CourseData.yaml b/openapi/v2/components/schemas/CourseData.yaml new file mode 100644 index 0000000..b85d928 --- /dev/null +++ b/openapi/v2/components/schemas/CourseData.yaml @@ -0,0 +1,34 @@ +type: + type: string + description: JSON:API resource type. + enum: ['course'] +id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value + that is unique within the Institution may be used. + # format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - title + - code + - ects + - languageOfInstruction + - lastModified + properties: + $ref: ./CourseDataProperties.yaml +meta: + $ref: ./CourseMeta.yaml +relationships: + $ref: ./CourseRelationships.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + instance: + $ref: ./links/LinksCourseInstanceCollection.yaml diff --git a/openapi/v2/components/schemas/CourseDataExtended.yaml b/openapi/v2/components/schemas/CourseDataExtended.yaml new file mode 100644 index 0000000..0091245 --- /dev/null +++ b/openapi/v2/components/schemas/CourseDataExtended.yaml @@ -0,0 +1,34 @@ +type: + type: string + description: JSON:API resource type. +id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value + that is unique within the Institution may be used. + # format: uuid + format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - title + - code + - ects + - languageOfInstruction + - lastModified + properties: + $ref: ./CourseDataExtendedProperties.yaml +meta: + $ref: ./CourseMeta.yaml +relationships: + $ref: ./CourseRelationships.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + instance: + $ref: ./links/LinksCourseInstanceCollection.yaml diff --git a/openapi/v2/components/schemas/CourseDataExtendedProperties.yaml b/openapi/v2/components/schemas/CourseDataExtendedProperties.yaml new file mode 100644 index 0000000..7b4af05 --- /dev/null +++ b/openapi/v2/components/schemas/CourseDataExtendedProperties.yaml @@ -0,0 +1,143 @@ +title: + type: array + minItems: 1 + description: Title with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml +code: + type: string + minItems: 1 + description: Human readable code identifying the Course. +ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. +languageOfInstruction: + $ref: ./fields/LanguageOfInstruction.yaml +lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +description: + type: array + minItems: 1 + description: Description with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +learningOutcomes: + type: array + minItems: 1 + description: Learning outcomes with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +academicTerm: + type: array + description: | + Academic term in which the Course is delivered. + + Multiple values are allowed in order to support Courses delivered in + in more than one academic term throughout an academic year. + + **Usage** + + - `1/2` indicates first (1) semester (1/2); + - `2/3` indicates second (2) trimester (1/3); + - `1/1` indicates full academic year. + items: + type: string + pattern: '^[1-9]\/[1/9]$' +assessmentMethod: + type: array + description: | + Assessment method with optional language code. + + **Note:** It is preferable to use `elmAssessmentType` instead. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +bibliography: + type: array + description: Bibliography with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +courseAvailability: + type: array + description: Course availability with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +courseContent: + type: array + description: Course content with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +elmAssessmentType: + $ref: ./fields/ElmAssessmentType.yaml +elmLearningActivityType: + $ref: ./fields/ElmLearningActivityType.yaml +elmLearningOpportunityType: + $ref: ./fields/ElmLearningOpportunityTypeCourse.yaml +elmModeOfLearning: + $ref: ./fields/ElmModeOfLearningAndAssessment.yaml +iscedCode: + type: array + description: | + ISCED-F code describing the field of education of the Course. + + Multiple values are allowed in order to support multidisplinary + Courses. + + **References** + + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 +localClassification: + $ref: ./fields/LocalClassification.yaml +prerequisites: + type: array + description: Prerequisites with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +restrictedToLocalStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at this Institution. +restrictedToAllianceStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at a partner Institution in the same University Alliance. +teachingMethod: + type: array + description: | + Teaching method with optional language code. + + **Note:** It is preferable to use `elmLearningActivityType` instead. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +url: + type: array + description: External URL with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml +deprecated: + type: boolean + description: | + Return `true` if a Course will no longer be delivered, or there is no + expectation that it will be delivered in the foreseeable future. + + **Deprecate, do not delete!** + + Institutions **must** keep a permanent record of all Courses ever delivered + so that they may be dereferenced from _Course instances_. + + Servers **must** omit deprecated Courses from Course collections (unless + `deprecated` is used as a filter). + + Servers **must** provide deprecated Course data via its **canonical path**. diff --git a/openapi/v2/components/schemas/CourseDataProperties.yaml b/openapi/v2/components/schemas/CourseDataProperties.yaml new file mode 100644 index 0000000..4090fb6 --- /dev/null +++ b/openapi/v2/components/schemas/CourseDataProperties.yaml @@ -0,0 +1,107 @@ +title: + type: array + minItems: 1 + description: Title with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml +code: + type: string + minItems: 1 + description: Human readable code identifying the Course. +ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. +languageOfInstruction: + $ref: ./fields/LanguageOfInstruction.yaml +lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +description: + type: array + minItems: 1 + description: Description with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +learningOutcomes: + type: array + minItems: 1 + description: Learning outcomes with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +academicTerm: + type: array + description: | + Academic term in which the Course is delivered. + + Multiple values are allowed in order to support Courses delivered in + in more than one academic term throughout an academic year. + + **Usage** + + - `1/2` indicates first (1) semester (1/2); + - `2/3` indicates second (2) trimester (1/3); + - `1/1` indicates full academic year. + items: + type: string + pattern: '^[1-9]\/[1/9]$' +elmAssessmentType: + $ref: ./fields/ElmAssessmentType.yaml +elmLearningActivityType: + $ref: ./fields/ElmLearningActivityType.yaml +elmLearningOpportunityType: + $ref: ./fields/ElmLearningOpportunityTypeCourse.yaml +elmModeOfLearning: + $ref: ./fields/ElmModeOfLearningAndAssessment.yaml +iscedCode: + type: array + description: | + ISCED-F code describing the field of education of the Course. + + Multiple values are allowed in order to support multidisplinary + Courses. + + **References** + + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 +localClassification: + $ref: ./fields/LocalClassification.yaml +restrictedToLocalStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at this Institution. +restrictedToAllianceStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at a partner Institution in the same University Alliance. +url: + type: array + description: External URL with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml +deprecated: + type: boolean + description: | + Return `true` if a Course will no longer be delivered, or there is no + expectation that it will be delivered in the foreseeable future. + + **Deprecate, do not delete!** + + Institutions **must** keep a permanent record of all Courses ever delivered + so that they may be dereferenced from _Course instances_. + + Servers **must** omit deprecated Courses from Course collections (unless + `deprecated` is used as a filter). + + Servers **must** provide deprecated Course data via its **canonical path**. diff --git a/openapi/v2/components/schemas/CourseInstanceCollection.yaml b/openapi/v2/components/schemas/CourseInstanceCollection.yaml new file mode 100644 index 0000000..bffcf27 --- /dev/null +++ b/openapi/v2/components/schemas/CourseInstanceCollection.yaml @@ -0,0 +1,26 @@ +type: object +description: JSON:API collection of _Course instance_ resources. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: array + description: List of _Course instance_ resources. + items: + type: object + required: + - type + - id + - attributes + - relationships + - links + properties: + $ref: ./CourseInstanceData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksCollection.yaml diff --git a/openapi/v2/components/schemas/CourseInstanceData.yaml b/openapi/v2/components/schemas/CourseInstanceData.yaml new file mode 100644 index 0000000..6098fc8 --- /dev/null +++ b/openapi/v2/components/schemas/CourseInstanceData.yaml @@ -0,0 +1,31 @@ +type: + type: string + description: JSON:API resource type. + enum: ['instance'] +id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value + that is unique within the Institution may be used. + # format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - startDate + - endDate + - academicTermId + - ects + - languageOfInstruction + - lastModified + properties: + $ref: ./CourseInstanceDataProperties.yaml +relationships: + $ref: ./CourseInstanceRelationships.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/CourseInstanceDataProperties.yaml b/openapi/v2/components/schemas/CourseInstanceDataProperties.yaml new file mode 100644 index 0000000..ab9521c --- /dev/null +++ b/openapi/v2/components/schemas/CourseInstanceDataProperties.yaml @@ -0,0 +1,43 @@ +startDate: + type: string + format: date + description: | + The first date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +endDate: + type: string + format: date + description: | + The last date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +academicTermId: + $ref: ./fields/AcademicTermId.yaml +ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. +languageOfInstruction: + $ref: ./fields/LanguageOfInstruction.yaml +lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +elmAssessmentType: + $ref: ./fields/ElmAssessmentType.yaml +elmLearningActivityType: + $ref: ./fields/ElmLearningActivityType.yaml +elmLearningOpportunityType: + $ref: ./fields/ElmLearningOpportunityTypeCourse.yaml +elmModeOfLearning: + $ref: ./fields/ElmModeOfLearningAndAssessment.yaml +engagementHours: + type: float + description: Total number of engagement hours during the entire Instance. + minimum: 0 +gradingScheme: + $ref: './GradingScheme.yaml' +resultDistribution: + $ref: ./ResultDistribution.yaml diff --git a/openapi/v2/components/schemas/CourseInstanceRelationships.yaml b/openapi/v2/components/schemas/CourseInstanceRelationships.yaml new file mode 100644 index 0000000..a922673 --- /dev/null +++ b/openapi/v2/components/schemas/CourseInstanceRelationships.yaml @@ -0,0 +1,38 @@ +type: object +description: | + JSON:API _relationships_ object. +required: + - course +properties: + course: + type: object + description: | + The _Course_ resource the _Course instance_ refers to. + required: + - data + - links + properties: + data: + type: object + description: _Course_ data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: ['course'] + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but + any value that is unique within the Institution may be used. + # format: uuid + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/CourseInstanceResource.yaml b/openapi/v2/components/schemas/CourseInstanceResource.yaml new file mode 100644 index 0000000..34e0544 --- /dev/null +++ b/openapi/v2/components/schemas/CourseInstanceResource.yaml @@ -0,0 +1,24 @@ +type: object +description: JSON:API _Course instance_ resource. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: object + description: _Course instance_ resource data. + required: + - type + - id + - attributes + - relationships + - links + properties: + $ref: ./CourseInstanceData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/CourseMeta.yaml b/openapi/v2/components/schemas/CourseMeta.yaml new file mode 100644 index 0000000..09ff39b --- /dev/null +++ b/openapi/v2/components/schemas/CourseMeta.yaml @@ -0,0 +1,41 @@ +type: object +description: | + JSON:API _meta_ object containing information about the relation between + a Course and all or specific Programmes. +properties: + relatedProgramme: + type: array + description: Describes the inclusion of a Course in a specific Programme. + + Any Programme indicated here **must** also be indicated in the + `relationships` object. + items: + type: object + required: + - programmeId + - mandatoryCourse + - year + properties: + programmeId: + type: string + description: ID of the _Programme_ resource. + # format: uuid + mandatoryCourse: + type: boolean + description: Whether the Course is mandatory within the Programme. + year: + type: string + description: | + Year of the Programme in which the Course is delivered. + + **Usage** + + - `2/3` means the Course is delivered in the second (2) of the three + (3) years of the Programme duration; + - `0/3` means the Course may be completed _at any point_ during the + three (3) years of the Programme duration; + - `4/4` may also refer to the fourth (4) year in a Programme with a + length of three and a half years (3.5) which must be rounded up in + the current context. + + pattern: '\d\/[1-9]' diff --git a/openapi/v2/components/schemas/CourseRelationships.yaml b/openapi/v2/components/schemas/CourseRelationships.yaml new file mode 100644 index 0000000..1520717 --- /dev/null +++ b/openapi/v2/components/schemas/CourseRelationships.yaml @@ -0,0 +1,79 @@ +type: object +description: | + JSON:API _relationships_ object. +properties: + prerequisiteCourse: + type: array + description: | + Another Course that **must** be completed before enrollment in the present + Course is allowed. + + If the prerequisites for the present Course cannot be matched to a single + Course (or multiple Courses), use the `prerequisites` data attribute for + a more detailed description. + items: + type: object + required: + - data + - links + properties: + data: + type: object + description: Prerequisite Course data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: ['course'] + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but + any value that is unique within the Institution may be used. + # format: uuid + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + relatedProgramme: + type: array + description: | + Any Programme which includes the present Course in its curricular plan. + + This **must** match all related Programmes indicated in the `meta` object. + items: + type: object + required: + - data + - links + properties: + data: + type: object + description: Related Programme data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: ['programme'] + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but + any value that is unique within the Institution may be used. + # format: uuid + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/CourseResource.yaml b/openapi/v2/components/schemas/CourseResource.yaml new file mode 100644 index 0000000..e325e26 --- /dev/null +++ b/openapi/v2/components/schemas/CourseResource.yaml @@ -0,0 +1,23 @@ +type: object +description: JSON:API _Course_ resource. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: object + description: _Course_ resource data. + required: + - type + - id + - attributes + - links + properties: + $ref: ./CourseDataExtended.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/Error.yaml b/openapi/v2/components/schemas/Error.yaml new file mode 100644 index 0000000..abfa446 --- /dev/null +++ b/openapi/v2/components/schemas/Error.yaml @@ -0,0 +1,32 @@ +type: object +description: JSON:API `errors` object. +required: + - errors +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + errors: + type: array + description: List of errors. + items: + type: object + description: JSON:API `error` object. + properties: + status: + type: string + description: The HTTP status code applicable to this problem. + title: + type: string + description: Human-readable summary of the problem. + source: + type: object + description: | + An object containing references to the source of the error. + properties: + pointer: + type: string + description: | + A JSON Pointer to the associated entity in the request document. + parameter: + type: string + description: Which URI query parameter caused the error. diff --git a/openapi/v2/components/schemas/GradingScheme.yaml b/openapi/v2/components/schemas/GradingScheme.yaml new file mode 100644 index 0000000..645f7a7 --- /dev/null +++ b/openapi/v2/components/schemas/GradingScheme.yaml @@ -0,0 +1,17 @@ +type: object +description: | + Grading scheme used at the Institution. +required: + - label +properties: + label: + type: array + description: Human readable label of the grading scheme with optional + language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + description: + type: array + description: Description of the grading scheme with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml diff --git a/openapi/v2/components/schemas/InstitutionCollection.yaml b/openapi/v2/components/schemas/InstitutionCollection.yaml new file mode 100644 index 0000000..2deee94 --- /dev/null +++ b/openapi/v2/components/schemas/InstitutionCollection.yaml @@ -0,0 +1,25 @@ +type: object +description: JSON:API collection of _Institution_ resources. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: array + description: List of _Institution_ resources. + items: + type: object + required: + - type + - id + - attributes + - links + properties: + $ref: ./InstitutionData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksCollection.yaml diff --git a/openapi/v2/components/schemas/InstitutionData.yaml b/openapi/v2/components/schemas/InstitutionData.yaml new file mode 100644 index 0000000..4b87624 --- /dev/null +++ b/openapi/v2/components/schemas/InstitutionData.yaml @@ -0,0 +1,57 @@ +type: + type: string + description: JSON:API resource type. + enum: ['hei'] +id: + type: string + description: JSON:API resource ID; **must match** `heiId`. + format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - title + - heiId + - lastModified + properties: + title: + type: array + minItems: 1 + description: Title with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + heiId: + type: string + description: The SCHAC code of the Institution. + format: hostname + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language + code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + url: + type: array + description: External URL with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + ounit: + $ref: ./links/LinksOunitCollection.yaml + programme: + $ref: ./links/LinksProgrammeCollection.yaml + course: + $ref: ./links/LinksCourseCollection.yaml diff --git a/openapi/v2/components/schemas/InstitutionResource.yaml b/openapi/v2/components/schemas/InstitutionResource.yaml new file mode 100644 index 0000000..46d1453 --- /dev/null +++ b/openapi/v2/components/schemas/InstitutionResource.yaml @@ -0,0 +1,23 @@ +type: object +description: JSON:API _Institution_ resource. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: object + description: _Institution_ resource data. + required: + - type + - id + - attributes + - links + properties: + $ref: ./InstitutionData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/OunitCollection.yaml b/openapi/v2/components/schemas/OunitCollection.yaml new file mode 100644 index 0000000..85bb8c6 --- /dev/null +++ b/openapi/v2/components/schemas/OunitCollection.yaml @@ -0,0 +1,25 @@ +type: object +description: JSON:API collection of _Organisational Unit_ resources. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: array + description: List of _Organisational Unit_ resources. + items: + type: object + required: + - type + - id + - attributes + - links + properties: + $ref: ./OunitData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksCollection.yaml diff --git a/openapi/v2/components/schemas/OunitData.yaml b/openapi/v2/components/schemas/OunitData.yaml new file mode 100644 index 0000000..49d74e2 --- /dev/null +++ b/openapi/v2/components/schemas/OunitData.yaml @@ -0,0 +1,58 @@ +type: + type: string + description: JSON:API resource type. + enum: ['ounit'] +id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value + that is unique within the Institution may be used. **Must** match `ounitId`. + # format: uuid + format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - title + - ounitId + - lastModified + properties: + title: + type: array + description: Title with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + ounitId: + type: string + description: Unique identifier within the Institution. + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language + code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + ounitCode: + type: string + description: Human readable code identifying the Organisational Unit. + url: + type: array + description: External URL with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + programme: + $ref: ./links/LinksProgrammeCollection.yaml + course: + $ref: ./links/LinksCourseCollection.yaml diff --git a/openapi/v2/components/schemas/OunitResource.yaml b/openapi/v2/components/schemas/OunitResource.yaml new file mode 100644 index 0000000..f13d0bd --- /dev/null +++ b/openapi/v2/components/schemas/OunitResource.yaml @@ -0,0 +1,23 @@ +type: object +description: JSON:API _Organisational Unit_ resource. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: object + description: _Organisational Unit_ resource data. + required: + - type + - id + - attributes + - links + properties: + $ref: ./OunitData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/Problem.yaml b/openapi/v2/components/schemas/Problem.yaml new file mode 100644 index 0000000..b0d320b --- /dev/null +++ b/openapi/v2/components/schemas/Problem.yaml @@ -0,0 +1,39 @@ +type: object +additionalProperties: true +minProperties: 1 +description: >- + The Problem Details JSON Object [[RFC7807](https://tools.ietf.org/html/rfc7807)]. +properties: + type: + type: string + description: >- + A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that identifies the problem type. + It should provide human-readable documentation for the problem type. + When this member is not present, its value is assumed to be "about:blank". + format: uri + title: + type: string + description: >- + A short, human-readable summary of the problem type. + It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization. + status: + type: integer + description: The HTTP status code. + minimum: 400 + maximum: 599 + detail: + type: string + description: >- + A human-readable explanation specific to this + occurrence of the problem. + instance: + type: string + description: >- + A URI reference that identifies the specific + occurrence of the problem. It may or may not yield further + information if dereferenced. + +# Consumers SHOULD NOT parse the "detail" member for information; +# extensions are more suitable and less error-prone ways to obtain such +# information. +# See: https://datatracker.ietf.org/doc/html/rfc7807#section-3.2 \ No newline at end of file diff --git a/openapi/v2/components/schemas/ProgrammeCollection.yaml b/openapi/v2/components/schemas/ProgrammeCollection.yaml new file mode 100644 index 0000000..46a82ac --- /dev/null +++ b/openapi/v2/components/schemas/ProgrammeCollection.yaml @@ -0,0 +1,25 @@ +type: object +description: JSON:API collection of _Programme_ resources. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: array + description: List of _Programme_ resources. + items: + type: object + required: + - type + - id + - links + - attributes + properties: + $ref: ./ProgrammeData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksCollection.yaml diff --git a/openapi/v2/components/schemas/ProgrammeData.yaml b/openapi/v2/components/schemas/ProgrammeData.yaml new file mode 100644 index 0000000..7722c40 --- /dev/null +++ b/openapi/v2/components/schemas/ProgrammeData.yaml @@ -0,0 +1,31 @@ +type: + type: string + description: JSON:API resource type. + enum: ['programme'] +id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value + that is unique within the Institution may be used. + # format: uuid +attributes: + type: object + description: JSON:API _attributes_ object. + required: + - title + - code + - ects + - eqfLevelProvided + - languageOfInstruction + - lastModified + properties: + $ref: ./ProgrammeDataProperties.yaml +links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: ./links/LinksResource.yaml + course: + $ref: ./links/LinksCourseCollection.yaml diff --git a/openapi/v2/components/schemas/ProgrammeDataProperties.yaml b/openapi/v2/components/schemas/ProgrammeDataProperties.yaml new file mode 100644 index 0000000..0e8ecca --- /dev/null +++ b/openapi/v2/components/schemas/ProgrammeDataProperties.yaml @@ -0,0 +1,83 @@ +title: + type: array + minItems: 1 + description: Title with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml +code: + type: string + minLength: 1 + description: Human readable code identifying the Programme. +ects: + type: integer + minimum: 0 + description: Number of ECTS credits required to complete the Programme. +eqfLevelProvided: + $ref: ./fields/EqfLevelProvided.yaml +languageOfInstruction: + $ref: ./fields/LanguageOfInstruction.yaml +lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +description: + type: array + minItems: 1 + description: Description with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +learningOutcomes: + type: array + minItems: 1 + description: Learning outcomes with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml +abbreviation: + type: array + description: Abbbreviation with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml +elmLearningOpportunityType: + $ref: ./fields/ElmLearningOpportunityTypeProgramme.yaml +elmLearningScheduleType: + $ref: ./fields/ElmLearningScheduleType.yaml +elmModeOfLearning: + $ref: ./fields/ElmModeOfLearningAndAssessment.yaml +iscedCode: + type: array + minItems: 1 + description: | + ISCED-F code describing the field of education of the Programme. + + Multiple values are allowed in order to support multidisplinary + Programmes. + + **References** + + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 +length: + $ref: ./fields/ProgrammeLength.yaml +url: + type: array + description: External URL with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml +validSince: + type: string + format: date + description: | + The first date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). +validUntil: + type: string + format: date + description: | + The last date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). diff --git a/openapi/v2/components/schemas/ProgrammeResource.yaml b/openapi/v2/components/schemas/ProgrammeResource.yaml new file mode 100644 index 0000000..252ca6a --- /dev/null +++ b/openapi/v2/components/schemas/ProgrammeResource.yaml @@ -0,0 +1,23 @@ +type: object +description: JSON:API _Programme_ resource. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + type: object + description: _Programme_ resource data. + required: + - type + - id + - attributes + - links + properties: + $ref: ./ProgrammeData.yaml + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksResource.yaml diff --git a/openapi/v2/components/schemas/ResultDistribution.yaml b/openapi/v2/components/schemas/ResultDistribution.yaml new file mode 100644 index 0000000..72f2e0d --- /dev/null +++ b/openapi/v2/components/schemas/ResultDistribution.yaml @@ -0,0 +1,18 @@ +type: object +description: | + _Optional. Describes a histogram of results achieved by all the students of + this course instance (including the ones who have failed the course). Note + that labels of the histogram are not integers, e.g. they may contain ranges + (like "10-20", or "more than 150")._ +properties: + category: + type: array + minItems: 1 + items: + $ref: ./fields/ResultDistributionCategory.yaml + description: + type: array + description: | + Additional description of the histogram with optional language code. + items: + $ref: ./fields/MultilineStringWithOptionalLang.yaml diff --git a/openapi/v2/components/schemas/Root.yaml b/openapi/v2/components/schemas/Root.yaml new file mode 100644 index 0000000..c86e073 --- /dev/null +++ b/openapi/v2/components/schemas/Root.yaml @@ -0,0 +1,18 @@ +type: object +description: Available endpoints and metadata. +required: + - data +properties: + jsonapi: + $ref: ./links/Jsonapi.yaml + data: + $ref: ./ServerData.yaml + meta: + type: object + description: Optional metadata. + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: ./links/LinksSelf.yaml diff --git a/openapi/v2/components/schemas/Schema.yaml b/openapi/v2/components/schemas/Schema.yaml new file mode 100644 index 0000000..308414a --- /dev/null +++ b/openapi/v2/components/schemas/Schema.yaml @@ -0,0 +1,154 @@ +type: object +title: Scalars +properties: + stringProperty: + description: Property name's description (type is string) + type: string + examples: + - example + - sample + readOnlyStringProperty: + description: Notice this only appears in the response. + type: string + readOnly: true + examples: + - example + writeOnlyStringProperty: + description: Notice this only appears in the request. + type: string + writeOnly: true + examples: + - example + minLengthString: + description: Property name's description (type is string) + type: string + minLength: 4 + examples: + - example + maxLengthString: + description: Property name's description (type is string) + type: string + maxLength: 140 + examples: + - example + minAndMaxLengthString: + description: Property name's description (type is string) + type: string + minLength: 4 + maxLength: 140 + examples: + - example + nullableOrStringProperty: + description: Property name's description (type is string or null) + type: + - string + - null + examples: + - example + stringEnumValues: + description: Property name's description (type is string) + type: string + enum: + - sample + - example + - specimen + - case + - instance + - illustration + stringDateTime: + description: Property name's description (type is string, format is date-time) + type: string + format: date-time + stringDate: + description: Property name's description (type is string, format is date-time) + type: string + format: date + stringEmail: + description: Property name's description (type is string, format is email) + type: string + format: email + stringIpAddressV4: + description: Property name's description (type is string, format is ipv4 address) + type: string + format: ipv4 + stringIpAddressV6: + description: Property name's description (type is string, format is ipv6 address) + type: string + format: ipv6 + stringPassword: + description: Property name's description (type is string, format is password) + type: string + format: password + stringHostname: + description: Property name's description (type is string, format is hostname) + type: string + format: hostname + stringUri: + description: Property name's description (type is string, format is uri) + type: string + format: uri + stringUuid: + description: Property name's description (type is string, format is uuid) + type: string + format: uuid + numberProperty: + description: Property name's description (type is number) + type: number + example: 8 + numberFloat: + description: Property name's description (type is number, format is float) + type: number + format: float + numberDouble: + description: Property name's description (type is number, format is double) + type: number + format: double + numberGreaterThanOrEquals: + description: Property name's description (type is number) + type: number + minimum: 5 + numberGreaterThan: + description: Property name's description (type is number) + type: number + exclusiveMinimum: 5 + numberLessThan: + description: Property name's description (type is number) + type: number + exclusiveMaximum: 8 + numberLessThanOrEquals: + description: Property name's description (type is number) + type: number + maximum: 8 + numberRange: + description: Property name's description (type is number) + type: number + minimum: 5 + maximum: 8 + numberRangeExclusiveMaximum: + description: Property name's description (type is number) + type: number + minimum: 5 + exclusiveMaximum: 8 + numberRangeExclusiveMinimumAndMaximum: + description: Property name's description (type is number) + type: number + exclusiveMinimum: 5 + exclusiveMaximum: 8 + numberMultipleOf: + description: Property name's description (type is number) + type: number + multipleOf: 2 + integerType: + description: Property name's description (type is integer) + type: integer + integer32bit: + description: Property name's description (type is integer, format is int32) + type: integer + format: int32 + integer64bit: + description: Property name's description (type is integer, format is int64) + type: integer + format: int64 + booleanProperty: + description: Property name's description (type is boolean) + type: boolean diff --git a/openapi/v2/components/schemas/ServerData.yaml b/openapi/v2/components/schemas/ServerData.yaml new file mode 100644 index 0000000..89170a5 --- /dev/null +++ b/openapi/v2/components/schemas/ServerData.yaml @@ -0,0 +1,45 @@ +type: object +description: Information about the API server. +required: + - type + - id + - attributes + - links +properties: + type: + type: string + description: JSON:API resource type. + enum: ['server'] + id: + type: string + description: UUID v4 + format: uuid + attributes: + type: object + description: JSON:API _attributes_ object. + required: + - serverName + properties: + serverName: + type: array + minItems: 1 + description: Server name with optional language code. + items: + $ref: ./fields/StringWithOptionalLang.yaml + termsOfService: + type: array + minItems: 1 + description: URL for Terms of service with optional language code. + items: + $ref: ./fields/HttpWithOptionalLang.yaml + links: + type: object + description: JSON:API _links_ object. + required: + - self + - hei + properties: + self: + $ref: ./links/LinksResource.yaml + hei: + $ref: ./links/LinksInstitutionCollection.yaml diff --git a/openapi/v2/components/schemas/fields/AcademicTermId.yaml b/openapi/v2/components/schemas/fields/AcademicTermId.yaml new file mode 100644 index 0000000..d66aa9b --- /dev/null +++ b/openapi/v2/components/schemas/fields/AcademicTermId.yaml @@ -0,0 +1,16 @@ + type: string + description: | + The academic term ID, as defined by [Erasmus Without Paper](#), + combines the exact academic year with the (generic) academic term as seen + at the Course level. + + **Usage** + + - The exact academic year component is described as `yearStart/yearEnd`; + - Wherever the academic year begins and ends in different calendar years, + the values of `yearStart` and `yearEnd` will be consecutive: `2025/2026`; + - Wherever the academic year begins and ends in the same calendar year, + the values of `yearStart` and `yearEnd` will be the same: `2026/2026`; + - The (generic) academic term component is taken from the [Course](); + - The resulting format is `YYYY/YYYY-t/T` i.e. `2025/2026-1/2` means the + **first** (1) **semester** (2) of the academic year **2025/2026**. diff --git a/openapi/v2/components/schemas/fields/ElmAssessmentType.yaml b/openapi/v2/components/schemas/fields/ElmAssessmentType.yaml new file mode 100644 index 0000000..b35ae7f --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmAssessmentType.yaml @@ -0,0 +1,50 @@ +type: array +description: | + **Assessment type** as defined in the European Learning Model (ELM). + + **Usage** + + - `de4d165a6c` represents _artefact assessment_; + - `3484bd7e51` represents _continuous evaluation_; + - `56539a6507` represents _group performance_; + - `c_4f874951` represents _Guided self-assessment_; + - `7331eb4762` represents _level of attendance_; + - `2939dae15f` represents _marked assignment_; + - `d30284d7df` represents _oral examination_; + - `19a2e5e671` represents _peer assessment_; + - `812e3b0ae1` represents _peer review_; + - `812e3b0ae1` represents _peer review_; + - `4f03b91c0e` represents _portfolio_; + - `6a4db9f11d` represents _practical assessment_; + - `c_04b30a72` represents _Presentation_; + - `c4256a2726` represents _problem based learning_; + - `795dac4096` represents _project work_; + - `b1b68f6735` represents _quiz_; + - `c_2b3bd410` represents _Self-assessment_; + - `6e6cb2cc78` represents _written examination_. + + **References** + + [Assessment type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/assessment/25831c2) +items: + type: string + enum: [ + 'de4d165a6c', + '3484bd7e51', + '56539a6507', + 'c_4f874951', + '7331eb4762', + '2939dae15f', + 'd30284d7df', + '19a2e5e671', + '812e3b0ae1', + '812e3b0ae1', + '4f03b91c0e', + '6a4db9f11d', + 'c_04b30a72', + 'c4256a2726', + '795dac4096', + 'b1b68f6735', + 'c_2b3bd410', + '6e6cb2cc78' + ] diff --git a/openapi/v2/components/schemas/fields/ElmLearningActivityType.yaml b/openapi/v2/components/schemas/fields/ElmLearningActivityType.yaml new file mode 100644 index 0000000..ec0b191 --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmLearningActivityType.yaml @@ -0,0 +1,38 @@ +type: array +description: | + **Learning activity type** as defined in the European Learning Model (ELM). + + **Usage** + + - `d46a826a39` represents _apprenticeship_; + - `ff436ea7c9` represents _classroom coursework_; + - `bf2e3a7bae` represents _e-learning coursework_; + - `fd33e234ae` represents _educational programme_; + - `bf5588ff84` represents _internship_; + - `4357e0e681` represents _job experience_; + - `3c8bd58d62` represents _lab / simulation / practice coursework_; + - `c_5665a0ad` represents _mentoring and monitoring activity_; + - `a7e556215a` represents _research_; + - `b660f5dcea` represents _self-motivated study_; + - `59eaf34fab` represents _volunteering_; + - `efff75e10a` represents _workshop, seminar or conference_. + + **References** + + [Learning activity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-activity/25831c2) +items: + type: string + enum: [ + d46a826a39, + ff436ea7c9, + bf2e3a7bae, + fd33e234ae, + bf5588ff84, + 4357e0e681, + 3c8bd58d62, + c_5665a0ad, + a7e556215a, + b660f5dcea, + 59eaf34fab, + efff75e10a + ] diff --git a/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeCourse.yaml b/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeCourse.yaml new file mode 100644 index 0000000..eb0be3b --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeCourse.yaml @@ -0,0 +1,37 @@ +type: array +description: | + **Learning opportunity type** as defined in the European Learning Model (ELM). + + _Note_: limited to the items in the controlled vocabulary that may apply + to Courses. + + **Usage** + + - `63f9f6180c` represents _Apprenticeship_; + - `c_170b037d` represents _Challenge_; + - `7e1ac538db` represents _Class_; + - `05053c1cbe` represents _Course_; + - `77b99de990` represents _Internship_; + - `17744a2647` represents _MOOC_; + - `11252a5207` represents _Mentoring_; + - `8b965da2d4` represents _Service learning_; + - `65a4cf5de2` represents _Study visit_; + - `b2434ca358` represents _Thesis_. + + **References** + + [Learning opportunity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-opportunity/25831c2) +items: + type: string + enum: [ + '63f9f6180c', + 'c_170b037d', + '7e1ac538db', + '05053c1cbe', + '77b99de990', + '17744a2647', + '11252a5207', + '8b965da2d4', + '65a4cf5de2', + 'b2434ca358' + ] diff --git a/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeProgramme.yaml b/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeProgramme.yaml new file mode 100644 index 0000000..ff0f5f4 --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmLearningOpportunityTypeProgramme.yaml @@ -0,0 +1,23 @@ +type: array +description: | + **Learning opportunity type** as defined in the European Learning Model (ELM). + + _Note_: limited to the items in the controlled vocabulary that may apply + to Programmes. + + **Usage** + + - `79343569f3` represents _Educational programme_ + - `0f7dac46ca` represents _Programme module_ + - `74a4a268e8` represents _Short learning programme_ + + **References** + + [Learning opportunity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-opportunity/25831c2) +items: + type: string + enum: [ + '79343569f3', + '0f7dac46ca', + '74a4a268e8' + ] diff --git a/openapi/v2/components/schemas/fields/ElmLearningScheduleType.yaml b/openapi/v2/components/schemas/fields/ElmLearningScheduleType.yaml new file mode 100644 index 0000000..bd336eb --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmLearningScheduleType.yaml @@ -0,0 +1,20 @@ +type: array +description: | + **Learning schedule type** as defined in the European Learning Model (ELM). + + **Usage** + + - `72a0ab92fa` represents _Full time_ + - `f230bae523` represents _Part time intensive_ + - `67395e6b5a` represents _Part time light_ + + **References** + + [Learning schedule type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-schedule/25831c2) +items: + type: string + enum: [ + '72a0ab92fa', + 'f230bae523', + '67395e6b5a' + ] diff --git a/openapi/v2/components/schemas/fields/ElmModeOfLearningAndAssessment.yaml b/openapi/v2/components/schemas/fields/ElmModeOfLearningAndAssessment.yaml new file mode 100644 index 0000000..fc541ce --- /dev/null +++ b/openapi/v2/components/schemas/fields/ElmModeOfLearningAndAssessment.yaml @@ -0,0 +1,29 @@ +type: array +description: | + **Mode of learning and assessment** as defined in the European Learning + Model (ELM). + + **Usage** + + - `e92d221e4d` represents _Blended_ + - `c_3a90b26d` represents _Hybrid_ + - `920fbb3cbe` represents _Online_ + - `9191af2ed9` represents _Presential_ + - `7813801c77` represents _Project based_ + - `ed4c557045` represents _Research-Lab based_ + - `729f3bed4b` represents _Workbased_ + + **References** + + [Mode of learning and assessment - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-assessment/25831c2) +items: + type: string + enum: [ + 'e92d221e4d', + 'c_3a90b26d', + '920fbb3cbe', + '9191af2ed9', + '7813801c77', + 'ed4c557045', + '729f3bed4b' + ] diff --git a/openapi/v2/components/schemas/fields/EqfLevelProvided.yaml b/openapi/v2/components/schemas/fields/EqfLevelProvided.yaml new file mode 100644 index 0000000..a01a497 --- /dev/null +++ b/openapi/v2/components/schemas/fields/EqfLevelProvided.yaml @@ -0,0 +1,17 @@ +type: integer +minimum: 5 +maximum: 8 +description: | + European Qualifications Framework (EQF) level provided to the learner + upon completing the Programme. + + **Usage** + + - EQF level **5** for short cycle Programmes; + - EQF level **6** for first cycle Programmes (i.e. Bachelor's degree); + - EQF level **7** for short cycle Programmes (i.e. Master's degree); + - EQF level **8** for short cycle Programmes (i.e. Doctorate). + + **References** + + [European Qualifications Framework - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/eqf/25831c2) diff --git a/openapi/v2/components/schemas/fields/HttpWithOptionalLang.yaml b/openapi/v2/components/schemas/fields/HttpWithOptionalLang.yaml new file mode 100644 index 0000000..952b553 --- /dev/null +++ b/openapi/v2/components/schemas/fields/HttpWithOptionalLang.yaml @@ -0,0 +1,10 @@ +type: object +required: + - uri +properties: + uri: + type: string + format: uri + description: URL + lang: + $ref: ./Lang.yaml diff --git a/openapi/v2/components/schemas/fields/Lang.yaml b/openapi/v2/components/schemas/fields/Lang.yaml new file mode 100644 index 0000000..8e5740e --- /dev/null +++ b/openapi/v2/components/schemas/fields/Lang.yaml @@ -0,0 +1,20 @@ +type: + - string + - null +minLength: 2 +description: | + IETF BCP 47 language tag. + + Language tags allow to specify languages and their variations on script, region, etc. + + **Usage** + + - `el` for Greek + - `el-Latn` for Greek in Latin script. + - `el-CY` for Cypriot Greek + - `el-Latn-CY` for Cypriot Greek in Latin script. + + **References** + + - [Current specification](https://www.rfc-editor.org/info/bcp47) + - [Language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry) diff --git a/openapi/v2/components/schemas/fields/LanguageOfInstruction.yaml b/openapi/v2/components/schemas/fields/LanguageOfInstruction.yaml new file mode 100644 index 0000000..e4fe08f --- /dev/null +++ b/openapi/v2/components/schemas/fields/LanguageOfInstruction.yaml @@ -0,0 +1,22 @@ +type: array +minItems: 1 +description: | + IETF BCP 47 language tag. + + Language tags allow to specify languages and their variations on script, + region, etc. + + **Usage** + + - `el` for Greek + - `el-Latn` for Greek in Latin script. + - `el-CY` for Cypriot Greek + - `el-Latn-CY` for Cypriot Greek in Latin script. + + **References** + + - [Current specification](https://www.rfc-editor.org/info/bcp47) + - [Language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry) +items: + type: string + minLength: 2 diff --git a/openapi/v2/components/schemas/fields/LocalClassification.yaml b/openapi/v2/components/schemas/fields/LocalClassification.yaml new file mode 100644 index 0000000..70dbd6b --- /dev/null +++ b/openapi/v2/components/schemas/fields/LocalClassification.yaml @@ -0,0 +1,21 @@ +type: array +description: | + Indicates a local (national or other) classification system for fields + of study, followed by the applicable value (or code) in that system. + + Multiple values are allowed in order to support multidisplinary + Courses. +items: + type: object + required: + - classificationSystem + - classificationValue + properties: + classificationSystem: + type: string + description: 'Classification system' + minLength: 1 + classificationValue: + type: string + description: 'Classification value' + minLength: 1 diff --git a/openapi/v2/components/schemas/fields/MultilineStringWithOptionalLang.yaml b/openapi/v2/components/schemas/fields/MultilineStringWithOptionalLang.yaml new file mode 100644 index 0000000..ba5b5dc --- /dev/null +++ b/openapi/v2/components/schemas/fields/MultilineStringWithOptionalLang.yaml @@ -0,0 +1,10 @@ +type: object +required: + - multiline +properties: + multiline: + type: string + minLength: 1 + description: Text value, which may contain markup. + lang: + $ref: ./Lang.yaml diff --git a/openapi/v2/components/schemas/fields/ProgrammeLength.yaml b/openapi/v2/components/schemas/fields/ProgrammeLength.yaml new file mode 100644 index 0000000..096a9b4 --- /dev/null +++ b/openapi/v2/components/schemas/fields/ProgrammeLength.yaml @@ -0,0 +1,19 @@ +type: string +pattern: '^\d{1,2}\/\d$' +description: | + Length of the Programme in **number of academic terms**. + + The first numeric component matching `\d{1,2}` indicates the total + number of academic terms, while the second component matching `\d` + indicates the fraction of a full academic year corresponding to a + single academic term. + + **Usage** + + - `6/2` indicates six (6) semesters (1/2) equivalent to three full + academic years; + - `7/2` indicates seven (7) semesters (1/2) equivalent to three and a + half academic years; + - `9/3` indicates nine (9) trimesters (1/3) equivalent to three full + academic years; + - `3/1` indicates three (3) full years (1/1) absent a division in terms. diff --git a/openapi/v2/components/schemas/fields/ResultDistributionCategory.yaml b/openapi/v2/components/schemas/fields/ResultDistributionCategory.yaml new file mode 100644 index 0000000..4a96bde --- /dev/null +++ b/openapi/v2/components/schemas/fields/ResultDistributionCategory.yaml @@ -0,0 +1,20 @@ +type: object +description: | + _This describes a single range within the histogram._ +required: + - label + - count +properties: + label: + type: string + minLength: 1 + description: | + _The label of the histogram range. Should correspond to the grading scheme + which have been used. E.g. "C", or "20-30". If possible, the label + should be understandable in any language. If not, you should try to use + English._ + count: + type: integer + minimum: 0 + description: | + _The number of students whose grades fall within that category._ diff --git a/openapi/v2/components/schemas/fields/StringWithOptionalLang.yaml b/openapi/v2/components/schemas/fields/StringWithOptionalLang.yaml new file mode 100644 index 0000000..f92d8d1 --- /dev/null +++ b/openapi/v2/components/schemas/fields/StringWithOptionalLang.yaml @@ -0,0 +1,10 @@ +type: object +required: + - string +properties: + string: + type: string + minLength: 1 + description: Text value. + lang: + $ref: ./Lang.yaml diff --git a/openapi/v2/components/schemas/links/Jsonapi.yaml b/openapi/v2/components/schemas/links/Jsonapi.yaml new file mode 100644 index 0000000..b7e36b9 --- /dev/null +++ b/openapi/v2/components/schemas/links/Jsonapi.yaml @@ -0,0 +1,34 @@ +type: object +description: JSON:API header. +required: + - version + - meta +properties: + version: + type: string + description: JSON:API schema version. + meta: + type: object + description: JSON:API meta object. + required: + - links + properties: + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + type: object + description: Hypermedia link to the current path. + required: + - href + properties: + href: + type: string + format: uri + description: | + JSON:API version supported by the server. + + http://jsonapi.org/format/1.1/ diff --git a/openapi/v2/components/schemas/links/LinksCollection.yaml b/openapi/v2/components/schemas/links/LinksCollection.yaml new file mode 100644 index 0000000..1585730 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksCollection.yaml @@ -0,0 +1,8 @@ +type: object +description: Hypermedia link to this resource collection. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksCourseCollection.yaml b/openapi/v2/components/schemas/links/LinksCourseCollection.yaml new file mode 100644 index 0000000..d0f89b4 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksCourseCollection.yaml @@ -0,0 +1,9 @@ +type: object +description: | + Hypermedia link to the _Course_ collection associated with this resource. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksCourseInstanceCollection.yaml b/openapi/v2/components/schemas/links/LinksCourseInstanceCollection.yaml new file mode 100644 index 0000000..08133fe --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksCourseInstanceCollection.yaml @@ -0,0 +1,9 @@ +type: object +description: | + Hypermedia link to the _Course instance_ collection associated with this resource. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksInstitutionCollection.yaml b/openapi/v2/components/schemas/links/LinksInstitutionCollection.yaml new file mode 100644 index 0000000..efa3ec9 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksInstitutionCollection.yaml @@ -0,0 +1,9 @@ +type: object +description: | + Hypermedia link to the _Institution_ collection covered by this server. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksOunitCollection.yaml b/openapi/v2/components/schemas/links/LinksOunitCollection.yaml new file mode 100644 index 0000000..5c9faa4 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksOunitCollection.yaml @@ -0,0 +1,10 @@ +type: object +description: | + Hypermedia link to the _Organisational Unit_ collection associated with this + resource. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksProgrammeCollection.yaml b/openapi/v2/components/schemas/links/LinksProgrammeCollection.yaml new file mode 100644 index 0000000..9f87846 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksProgrammeCollection.yaml @@ -0,0 +1,9 @@ +type: object +description: | + Hypermedia link to the _Programme_ collection associated with this resource. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksResource.yaml b/openapi/v2/components/schemas/links/LinksResource.yaml new file mode 100644 index 0000000..595fba9 --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksResource.yaml @@ -0,0 +1,8 @@ +type: object +description: Hypermedia link to the **canonical path** of this resource. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/schemas/links/LinksSelf.yaml b/openapi/v2/components/schemas/links/LinksSelf.yaml new file mode 100644 index 0000000..c05b57a --- /dev/null +++ b/openapi/v2/components/schemas/links/LinksSelf.yaml @@ -0,0 +1,8 @@ +type: object +description: Hypermedia link to the current path. +required: + - href +properties: + href: + type: string + format: uri diff --git a/openapi/v2/components/securitySchemes/api_key.yaml b/openapi/v2/components/securitySchemes/api_key.yaml new file mode 100644 index 0000000..359e56e --- /dev/null +++ b/openapi/v2/components/securitySchemes/api_key.yaml @@ -0,0 +1,3 @@ +type: apiKey +in: header +name: api_key diff --git a/openapi/v2/components/securitySchemes/basic_auth.yaml b/openapi/v2/components/securitySchemes/basic_auth.yaml new file mode 100644 index 0000000..d016600 --- /dev/null +++ b/openapi/v2/components/securitySchemes/basic_auth.yaml @@ -0,0 +1,2 @@ +type: http +scheme: basic diff --git a/openapi/v2/components/securitySchemes/main_auth.yaml b/openapi/v2/components/securitySchemes/main_auth.yaml new file mode 100644 index 0000000..a8ba56c --- /dev/null +++ b/openapi/v2/components/securitySchemes/main_auth.yaml @@ -0,0 +1,7 @@ +type: oauth2 +flows: + implicit: + authorizationUrl: 'http://example.com/api/oauth/dialog' + scopes: + 'read:users': read users info + 'write:users': modify or remove users diff --git a/openapi/v2/info-description.md b/openapi/v2/info-description.md index 93deb67..1fe06dd 100644 --- a/openapi/v2/info-description.md +++ b/openapi/v2/info-description.md @@ -1,3 +1,3 @@ # Current status -This version (`v2@dev`) of the OCCAPI specification is a **work in progress** and reflects the discussions within the community, which are documented in the [GitHub issue queue](https://github.com/EuropeanUniversityFoundation/occapi-openapi/issues). +This version (`v2@alpha`) of the OCCAPI specification is a **work in progress** and reflects the discussions within the community, which are documented in the [GitHub issue queue](https://github.com/EuropeanUniversityFoundation/occapi-openapi/issues). diff --git a/openapi/v2/paths/README.md b/openapi/v2/paths/README.md new file mode 100644 index 0000000..02e3995 --- /dev/null +++ b/openapi/v2/paths/README.md @@ -0,0 +1,105 @@ +Paths +===== + +Organize your path definitions within this folder. You will reference your paths from your main `openapi.yaml` entrypoint file. + +It may help you to adopt some conventions: + +* path separator token (e.g. `@`) or subfolders +* path parameter (e.g. `{example}`) +* file-per-path or file-per-operation + +There are different benefits and drawbacks to each decision. + +You can adopt any organisation you wish. We have some tips for organizing paths based on common practices. + +## Each path in a separate file + +Use a predefined "path separator" and keep all of your path files in the top level of the `paths` folder. + +``` +# todo: insert tree view of paths folder +``` + +Redocly recommends using the `@` character for this case. + +In addition, Redocly recommends placing path parameters within `{}` curly braces if you adopt this style. + +#### Motivations + +* Quickly see a list of all paths. Many people think in terms of the "number" of "endpoints" (paths), and not the "number" of "operations" (paths * http methods). + +* Only the "file-per-path" option is semantically correct with the OpenAPI Specification 3.0.2. However, Redocly's openapi-cli will build valid bundles for any of the other options too. + + +#### Drawbacks + +* This may require multiple definitions per http method within a single file. +* It requires settling on a path separator (that is allowed to be used in filenames) and sticking to that convention. + +## Each operation in a separate file + +You may also place each operation in a separate file. + +In this case, if you want all paths at the top-level, you can concatenate the http method to the path name. Similar to the above option, you can + +### Files at top-level of `paths` + +You may name your files with some concatenation for the http method. For example, following a convention such as: `-.yaml`. + +#### Motivations + +* Quickly see all operations without needing to navigate subfolders. + +#### Drawbacks + +* Adopting an unusual path separator convention, instead of using subfolders. + +### Use subfolders to mirror API path structure + +Example: +``` +GET /customers + +/paths/customers/get.yaml +``` + +In this case, the path id defined within subfolders which mirror the API URL structure. + +Example with path parameter: +``` +GET /customers/{id} + +/paths/customers/{id}/get.yaml +``` + +#### Motivations + +It matches the URL structure. + +It is pretty easy to reference: + +```yaml +paths: + '/customers/{id}': + get: + $ref: ./paths/customers/{id}/get.yaml + put: + $ref: ./paths/customers/{id}/put.yaml +``` + +#### Drawbacks + +If you have a lot of nested folders, it may be confusing to reference your schemas. + +Example +``` +file: /paths/customers/{id}/timeline/{messageId}/get.yaml + +# excerpt of file + headers: + Rate-Limit-Remaining: + $ref: ../../../../../components/headers/Rate-Limit-Remaining.yaml + +``` +Notice the `../../../../../` in the ref which requires some attention to formulate correctly. While openapi-cli has a linter which suggests possible refs when there is a mistake, this is still a net drawback for APIs with deep paths. diff --git a/openapi/v2/paths/course.yaml b/openapi/v2/paths/course.yaml new file mode 100644 index 0000000..5dbb00a --- /dev/null +++ b/openapi/v2/paths/course.yaml @@ -0,0 +1,37 @@ +get: + tags: + - Course + summary: GET /hei/{heiId}/course + description: | + This endpoint lists all _Courses_ offered by an _Institution_. + operationId: getCourses + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseCollection.yaml + example: + $ref: ../components/responses/CourseCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/course@{id}-instance.yaml b/openapi/v2/paths/course@{id}-instance.yaml new file mode 100644 index 0000000..b6b4e00 --- /dev/null +++ b/openapi/v2/paths/course@{id}-instance.yaml @@ -0,0 +1,44 @@ +get: + tags: + - Course instance + summary: GET /hei/{heiId}/course/{id}/instance + description: | + This endpoint lists all _Course instances_ filtered by _Course_. + operationId: getCourseInstances + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + - name: id + in: path + description: The UUID of the _Course_ resource to filter by. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseInstanceCollection.yaml + example: + $ref: ../components/responses/CourseInstanceCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/course@{id}.yaml b/openapi/v2/paths/course@{id}.yaml new file mode 100644 index 0000000..81d4e77 --- /dev/null +++ b/openapi/v2/paths/course@{id}.yaml @@ -0,0 +1,47 @@ +get: + tags: + - Course + summary: GET /hei/{heiId}/course/{id} + description: | + This endpoint exposes extended information about a _Course_. + + A single resource response can include more fields than would appear in a collection response. + operationId: getCourseByUuid + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + format: hostname + - name: id + in: path + description: The UUID of the _Course_ resource. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseResource.yaml + example: + $ref: ../components/responses/CourseResource.yaml + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/ResourceNotFound.yaml diff --git a/openapi/v2/paths/hei.yaml b/openapi/v2/paths/hei.yaml new file mode 100644 index 0000000..8d05781 --- /dev/null +++ b/openapi/v2/paths/hei.yaml @@ -0,0 +1,35 @@ +get: + tags: + - Institution + summary: GET /hei + description: | + This endpoint lists all _Institutions_ covered by this server. + + In order to obtain more detailed and up to date information about an + Institution, it is **recommended** that client implementations use the + [HEI API](https://hei.api.uni-foundation.eu) service provided by the + [European University Foundation](https://uni-foundation.eu/). + operationId: getInstitutions + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/InstitutionCollection.yaml + example: + $ref: ../components/responses/InstitutionCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/hei@{heiId}.yaml b/openapi/v2/paths/hei@{heiId}.yaml new file mode 100644 index 0000000..41be78f --- /dev/null +++ b/openapi/v2/paths/hei@{heiId}.yaml @@ -0,0 +1,44 @@ +get: + tags: + - Institution + summary: GET /hei/{heiId} + description: | + This endpoint exposes some basic information about an Institution covered by + the server, which should be sufficient to satisfy basic UX/UI needs of + app developers. + + In order to obtain more detailed and up to date information about an + Institution, it is **recommended** that client implementations use the + [HEI API](https://hei.api.uni-foundation.eu) service provided by the + [European University Foundation](https://uni-foundation.eu/). + operationId: getInstitutionById + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/InstitutionResource.yaml + example: + $ref: ../components/responses/InstitutionResource.yaml + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/ResourceNotFound.yaml diff --git a/openapi/v2/paths/instance@{id}.yaml b/openapi/v2/paths/instance@{id}.yaml new file mode 100644 index 0000000..be458fe --- /dev/null +++ b/openapi/v2/paths/instance@{id}.yaml @@ -0,0 +1,45 @@ +get: + tags: + - Course instance + summary: GET /hei/{heiId}/instance/{id} + description: | + This endpoint exposes information about a _Course instance_. + operationId: getCourseInstanceByUuid + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + format: hostname + - name: id + in: path + description: The UUID of the _Course instance_ resource. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseInstanceResource.yaml + example: + $ref: ../components/responses/CourseInstanceResource.yaml + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/ResourceNotFound.yaml diff --git a/openapi/v2/paths/ounit.yaml b/openapi/v2/paths/ounit.yaml new file mode 100644 index 0000000..393acff --- /dev/null +++ b/openapi/v2/paths/ounit.yaml @@ -0,0 +1,41 @@ +get: + tags: + - Organisational Unit + summary: GET /hei/{heiId}/ounit + description: | + This endpoint lists all _Organisational Units_ in an _Institution_. + + Implementation is optional but **recommended** since exposing collections of + _Programmes_ or _Courses_ filtered by _Organisational Unit_ can help avoid + large HTTP responses. + operationId: getOunits + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/OunitCollection.yaml + example: + $ref: ../components/responses/OunitCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/ounit@{id}-course.yaml b/openapi/v2/paths/ounit@{id}-course.yaml new file mode 100644 index 0000000..58f97e3 --- /dev/null +++ b/openapi/v2/paths/ounit@{id}-course.yaml @@ -0,0 +1,44 @@ +get: + tags: + - Course + summary: GET /hei/{heiId}/ounit/{id}/course + description: | + This endpoint lists all _Courses_ offered by an _Institution_ filtered by _Organisational Unit_. + operationId: getOunitCourses + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + - name: id + in: path + description: The UUID of the _Organisational Unit_ resource to filter by. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseCollection.yaml + example: + $ref: ../components/responses/OunitCourseCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/ounit@{id}-programme.yaml b/openapi/v2/paths/ounit@{id}-programme.yaml new file mode 100644 index 0000000..c01acb3 --- /dev/null +++ b/openapi/v2/paths/ounit@{id}-programme.yaml @@ -0,0 +1,44 @@ +get: + tags: + - Programme + summary: GET /hei/{heiId}/ounit/{id}/programme + description: | + This endpoint lists all _Programmes_ offered by an _Institution_ filtered by _Organisational Unit_. + operationId: getOunitProgrammes + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + - name: id + in: path + description: The UUID of the _Organisational Unit_ resource to filter by. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/ProgrammeCollection.yaml + example: + $ref: ../components/responses/OunitProgrammeCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/ounit@{id}.yaml b/openapi/v2/paths/ounit@{id}.yaml new file mode 100644 index 0000000..f7505f7 --- /dev/null +++ b/openapi/v2/paths/ounit@{id}.yaml @@ -0,0 +1,48 @@ +get: + tags: + - Organisational Unit + summary: GET /hei/{heiId}/ounit/{id} + description: | + This endpoint exposes some basic information about an _Organisational Unit_. + + Implementation is optional but **recommended** since exposing collections by + _Organisational Unit_ can help avoid large HTTP responses. + operationId: getOunitByUuid + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + format: hostname + - name: id + in: path + description: The UUID of the _Organisational Unit_ resource. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/OunitResource.yaml + example: + $ref: ../components/responses/OunitResource.yaml + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/ResourceNotFound.yaml diff --git a/openapi/v2/paths/programme.yaml b/openapi/v2/paths/programme.yaml new file mode 100644 index 0000000..6d53363 --- /dev/null +++ b/openapi/v2/paths/programme.yaml @@ -0,0 +1,37 @@ +get: + tags: + - Programme + summary: GET /hei/{heiId}/programme + description: | + This endpoint lists all _Programmes_ offered by an _Institution_. + operationId: getProgrammes + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/ProgrammeCollection.yaml + example: + $ref: ../components/responses/ProgrammeCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/programme@{id}-course.yaml b/openapi/v2/paths/programme@{id}-course.yaml new file mode 100644 index 0000000..42ff2ff --- /dev/null +++ b/openapi/v2/paths/programme@{id}-course.yaml @@ -0,0 +1,44 @@ +get: + tags: + - Course + summary: GET /hei/{heiId}/programme/{id}/course + description: | + This endpoint lists all _Courses_ offered by an _Institution_ filtered by _Programme_. + operationId: getProgrammeCourses + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + - name: id + in: path + description: The UUID of the _Programme_ resource to filter by. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/CourseCollection.yaml + example: + $ref: ../components/responses/ProgrammeCourseCollection.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/openapi/v2/paths/programme@{id}.yaml b/openapi/v2/paths/programme@{id}.yaml new file mode 100644 index 0000000..bbcded3 --- /dev/null +++ b/openapi/v2/paths/programme@{id}.yaml @@ -0,0 +1,45 @@ +get: + tags: + - Programme + summary: GET /hei/{heiId}/programme/{id} + description: | + This endpoint exposes information about a _Programme_. + operationId: getProgrammeByUuid + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + format: hostname + - name: id + in: path + description: The UUID of the _Programme_ resource. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/ProgrammeResource.yaml + example: + $ref: ../components/responses/ProgrammeResource.yaml + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/ResourceNotFound.yaml diff --git a/openapi/v2/paths/root.yaml b/openapi/v2/paths/root.yaml new file mode 100644 index 0000000..bead2f8 --- /dev/null +++ b/openapi/v2/paths/root.yaml @@ -0,0 +1,29 @@ +get: + tags: + - API server + summary: GET / + description: Get server information and primary Hypermedia links. + operationId: getRoot + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: ['application/vnd.api+json'] + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Root.yaml + example: + $ref: ../components/responses/Root.yaml + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: ../components/schemas/Error.yaml + example: + $ref: ../components/responses/EndpointNotAvailable.yaml diff --git a/public/v2/openapi.yaml b/public/v2/openapi.yaml index 26d1e4b..a6100a1 100644 --- a/public/v2/openapi.yaml +++ b/public/v2/openapi.yaml @@ -1,6 +1,6 @@ openapi: 3.1.0 info: - version: 2.0.0-dev + version: 2.0.0-alpha title: Open Course Catalogue API termsOfService: '' contact: @@ -11,15 +11,15 @@ info: description: | # Current status - This version (`v2@dev`) of the OCCAPI specification is a **work in progress** and reflects the discussions within the community, which are documented in the [GitHub issue queue](https://github.com/EuropeanUniversityFoundation/occapi-openapi/issues). + This version (`v2@alpha`) of the OCCAPI specification is a **work in progress** and reflects the discussions within the community, which are documented in the [GitHub issue queue](https://github.com/EuropeanUniversityFoundation/occapi-openapi/issues). servers: - url: /occapi/v2 description: Sandbox server (example data) tags: - - name: API provider - description: Information about the provider. + - name: API server + description: Information about the server. - name: Institution - description: Information about the Institutions covered by the provider. + description: Information about the Institutions covered by the server. - name: Organisational Unit description: Information about Organisational Units in an Institution. - name: Programme @@ -29,41 +29,60 @@ tags: Information about Courses offered by an Institution. _Course_ resources include a JSON:API _meta_ object containing information - about the relation between each Course and all or specific Programmes. + about the relation between each Course and specific Programmes. + - name: Course instance + description: | + Information about instances of Courses offered by an Institution. + + _Course instance_ resources are directly linked to _Course_ resources. paths: /: get: tags: - - API provider + - API server summary: GET / - description: Get primary Hypermedia links and optional metadata about the provider. + description: Get server information and primary Hypermedia links. operationId: getRoot responses: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/Root' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ + data: + type: server + id: 12345678-90ab-cdef-1234-567890abcdef + attributes: + serverName: + - string: Test server + lang: en + - string: Servidor de testes + lang: pt + termsOfService: [] + links: + self: + href: http://example.com/occapi/v2 + hei: + href: http://example.com/occapi/v2/hei meta: {} links: self: - href: http://example.com/occapi/v1 - hei: - href: http://example.com/occapi/v1/hei + href: http://example.com/occapi/v2 '404': description: Endpoint not available. content: @@ -72,11 +91,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -86,7 +105,7 @@ paths: - Institution summary: GET /hei description: | - This endpoint lists all _Institutions_ covered by this provider. + This endpoint lists all _Institutions_ covered by this server. In order to obtain more detailed and up to date information about an Institution, it is **recommended** that client implementations use the @@ -97,40 +116,49 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/InstitutionCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: hei - id: 12345678-90ab-cdef-1234-567890abcdef + id: domain.tld attributes: title: - string: Example Institution lang: en - abbreviation: EI + abbreviation: + - string: EI heiId: domain.tld url: - uri: www.domain.tld lang: en + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld + href: http://example.com/occapi/v2/hei/domain.tld + ounit: + href: http://example.com/occapi/v2/hei/domain.tld/ounit + programme: + href: http://example.com/occapi/v2/hei/domain.tld/programme + course: + href: http://example.com/occapi/v2/hei/domain.tld/course links: self: - href: http://example.com/occapi/v1/hei + href: http://example.com/occapi/v2/hei '404': description: Endpoint not available. content: @@ -139,11 +167,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -154,7 +182,7 @@ paths: summary: GET /hei/{heiId} description: | This endpoint exposes some basic information about an Institution covered by - the provider, which should be sufficient to satisfy basic UX/UI needs of + the server, which should be sufficient to satisfy basic UX/UI needs of app developers. In order to obtain more detailed and up to date information about an @@ -173,46 +201,49 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/InstitutionResource' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: type: hei - id: 12345678-90ab-cdef-1234-567890abcdef + id: domain.tld attributes: title: - string: Example Institution lang: en - abbreviation: EI + abbreviation: + - string: EI heiId: domain.tld url: - uri: www.domain.tld lang: en + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld + href: http://example.com/occapi/v2/hei/domain.tld + ounit: + href: http://example.com/occapi/v2/hei/domain.tld/ounit + programme: + href: http://example.com/occapi/v2/hei/domain.tld/programme + course: + href: http://example.com/occapi/v2/hei/domain.tld/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld - ounit: - href: http://example.com/occapi/v1/hei/domain.tld/ounit - programme: - href: http://example.com/occapi/v1/hei/domain.tld/programme - course: - href: http://example.com/occapi/v1/hei/domain.tld/course + href: http://example.com/occapi/v2/hei/domain.tld '404': description: Resource not found. content: @@ -221,11 +252,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Resource not found. @@ -237,8 +268,9 @@ paths: description: | This endpoint lists all _Organisational Units_ in an _Institution_. - Implementation is optional but **recommended** since exposing collections by - _Organisational Unit_ can help avoid large HTTP responses. + Implementation is optional but **recommended** since exposing collections of + _Programmes_ or _Courses_ filtered by _Organisational Unit_ can help avoid + large HTTP responses. operationId: getOunits parameters: - name: heiId @@ -251,22 +283,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/OunitCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: ounit id: 11223344-5566-7788-9900-aabbccddeeff @@ -274,18 +307,24 @@ paths: title: - string: Example Organisational Unit lang: en - abbreviation: EOU + abbreviation: + - string: EOU ounitId: 11223344-5566-7788-9900-aabbccddeeff ounitCode: EI-EOU url: - uri: www.domain.tld/eou lang: en + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff + programme: + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme + course: + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit + href: http://example.com/occapi/v2/hei/domain.tld/ounit '404': description: Endpoint not available. content: @@ -294,11 +333,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -332,22 +371,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/OunitResource' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: type: ounit id: 11223344-5566-7788-9900-aabbccddeeff @@ -355,22 +395,24 @@ paths: title: - string: Example Organisational Unit lang: en - abbreviation: EOU + abbreviation: + - string: EOU ounitId: 11223344-5566-7788-9900-aabbccddeeff ounitCode: EI-EOU url: - uri: www.domain.tld/eou lang: en + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff + programme: + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme + course: + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff - programme: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme - course: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff '404': description: Resource not found. content: @@ -379,11 +421,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Resource not found. @@ -406,22 +448,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/ProgrammeCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: programme id: abcdef12-3456-7890-abcd-ef1234567890 @@ -430,26 +473,47 @@ paths: - string: Example Programme lang: en code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 description: - multiline: | This is the description of the Programme. This is a long text field. lang: en - ects: 120 - eqfLevelProvided: 5 - iscedCode: 0 - languageOfInstruction: en - length: 2 + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 url: - uri: www.domain.tld/example/programme lang: en + validSince: '2020-01-01' + validUntil: '2029-12-31' + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + course: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme + href: http://example.com/occapi/v2/hei/domain.tld/programme '404': description: Endpoint not available. content: @@ -458,11 +522,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -492,22 +556,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/ProgrammeCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: programme id: abcdef12-3456-7890-abcd-ef1234567890 @@ -516,26 +581,47 @@ paths: - string: Example Programme lang: en code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 description: - multiline: | This is the description of the Programme. This is a long text field. lang: en - ects: 120 - eqfLevelProvided: 5 - iscedCode: 0 - languageOfInstruction: en - length: 2 + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 url: - uri: www.domain.tld/example/programme lang: en + validSince: '2020-01-01' + validUntil: '2029-12-31' + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + course: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/programme '404': description: Endpoint not available. content: @@ -544,11 +630,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -579,22 +665,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/ProgrammeResource' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: type: programme id: abcdef12-3456-7890-abcd-ef1234567890 @@ -603,28 +690,47 @@ paths: - string: Example Programme lang: en code: PROG01 + ects: 120 + eqfLevelProvided: 5 + abbreviation: + - string: P1 description: - multiline: | This is the description of the Programme. This is a long text field. lang: en - ects: 120 - eqfLevelProvided: 5 - iscedCode: '0000' - languageOfInstruction: en - length: 2 + elmLearningOpportunityType: + - 74a4a268e8 + elmLearningScheduleType: + - 67395e6b5a + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en + learningOutcomes: + - multiline: | + These are the learning outcomes of the Programme. + + This is a long text field. + lang: en + length: 4/2 url: - uri: www.domain.tld/example/programme lang: en + validSince: '2020-01-01' + validUntil: '2029-12-31' + lastModified: '2025-09-01T12:00:00Z' links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + course: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 - course: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 '404': description: Resource not found. content: @@ -633,11 +739,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Resource not found. @@ -660,22 +766,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/CourseCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: course id: aabbccdd-eeff-1122-3344-556677889900 @@ -684,42 +791,68 @@ paths: - string: Example Course lang: en code: COUR01 + ects: 7.5 + academicTerm: + - 1/2 description: - multiline: | This is the description of the Course. This is a long text field. lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en learningOutcomes: - multiline: | These are the learning outcomes of the Course. This is a long text field. lang: en - academicTerm: 1/2 - ects: 6 - languageOfInstruction: en - iscedCode: '0000' - subjectArea: '00.0' - otherCategorization: zero - unavailableForIncomingMobility: false + localClassification: + - classificationSystem: erasmus + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true url: - uri: www.domain.tld/example/course lang: en + lastModified: '2025-09-01T12:00:00Z' + deprecated: false meta: - global: - eqfLevel: 6 - year: 1/3 - programme: + relatedProgramme: - programmeId: abcdef12-3456-7890-abcd-ef1234567890 mandatoryCourse: true year: 1/2 + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + instance: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course + href: http://example.com/occapi/v2/hei/domain.tld/course '404': description: Endpoint not available. content: @@ -728,11 +861,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -762,22 +895,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/CourseCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: course id: aabbccdd-eeff-1122-3344-556677889900 @@ -786,41 +920,68 @@ paths: - string: Example Course lang: en code: COUR01 + ects: 7.5 + academicTerm: + - 1/2 description: - multiline: | This is the description of the Course. This is a long text field. lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en learningOutcomes: - multiline: | These are the learning outcomes of the Course. This is a long text field. lang: en - academicTerm: 1/2 - ects: 6 - languageOfInstruction: en - iscedCode: '0000' - subjectArea: '00.0' - otherCategorization: zero + localClassification: + - classificationSystem: erasmus + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true url: - uri: www.domain.tld/example/course lang: en + lastModified: '2025-09-01T12:00:00Z' + deprecated: false meta: - global: - eqfLevel: 6 - year: 1/3 - programme: + relatedProgramme: - programmeId: abcdef12-3456-7890-abcd-ef1234567890 mandatoryCourse: true year: 1/2 + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + instance: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance links: self: - href: http://example.com/occapi/v1/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course + href: http://example.com/occapi/v2/hei/domain.tld/ounit/11223344-5566-7788-9900-aabbccddeeff/course '404': description: Endpoint not available. content: @@ -829,11 +990,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -863,22 +1024,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/CourseCollection' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: - type: course id: aabbccdd-eeff-1122-3344-556677889900 @@ -887,41 +1049,68 @@ paths: - string: Example Course lang: en code: COUR01 + ects: 7.5 + academicTerm: + - 1/2 description: - multiline: | This is the description of the Course. This is a long text field. lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en learningOutcomes: - multiline: | These are the learning outcomes of the Course. This is a long text field. lang: en - academicTerm: 1/2 - ects: 6 - languageOfInstruction: en - iscedCode: '0000' - subjectArea: '00.0' - otherCategorization: zero + localClassification: + - classificationSystem: erasmus + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true url: - uri: www.domain.tld/example/course lang: en + lastModified: '2025-09-01T12:00:00Z' + deprecated: false meta: - global: - eqfLevel: 6 - year: 1/3 - programme: + relatedProgramme: - programmeId: abcdef12-3456-7890-abcd-ef1234567890 mandatoryCourse: true year: 1/2 + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + instance: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance links: self: - href: http://example.com/occapi/v1/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890/course '404': description: Endpoint not available. content: @@ -930,11 +1119,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Endpoint not available. @@ -967,22 +1156,23 @@ paths: '200': description: OK headers: - X-Rate-Limit: - description: calls per hour allowed by the user. + Content-Type: + description: HTTP Content-Type representation header. schema: - type: integer - format: int32 + type: string + enum: + - application/vnd.api+json content: application/vnd.api+json: schema: $ref: '#/components/schemas/CourseResource' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ data: type: course id: aabbccdd-eeff-1122-3344-556677889900 @@ -991,25 +1181,41 @@ paths: - string: Example Course lang: en code: COUR01 + ects: 7.5 + academicTerm: + - 1/2 description: - multiline: | This is the description of the Course. This is a long text field. lang: en + elmAssessmentType: + - 3484bd7e51 + - d30284d7df + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + iscedCode: + - '0000' + languageOfInstruction: + - en learningOutcomes: - multiline: | These are the learning outcomes of the Course. This is a long text field. lang: en - academicTerm: 1/2 - ects: 6 - languageOfInstruction: en - iscedCode: '0000' - subjectArea: '00.0' - otherCategorization: zero - unavailableForIncomingMobility: false + localClassification: + - classificationSystem: erasmus + classificationValue: '00.0' + restrictedToLocalStudents: false + restrictedToAllianceStudents: true url: - uri: www.domain.tld/example/course lang: en @@ -1049,20 +1255,204 @@ paths: This is a long text field. lang: en + lastModified: '2025-09-01T12:00:00Z' + deprecated: false meta: - global: - eqfLevel: 6 - year: 1/3 - programme: + relatedProgramme: - programmeId: abcdef12-3456-7890-abcd-ef1234567890 mandatoryCourse: true year: 1/2 + relationships: + prerequisiteCourse: [] + relatedProgramme: + - data: + type: programme + id: abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/programme/abcdef12-3456-7890-abcd-ef1234567890 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + instance: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + '404': + description: Resource not found. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Error' + example: + jsonapi: + version: '1.1' + meta: + links: + self: + href: http://jsonapi.org/format/1.1/ + errors: + - status: '404' + title: Resource not found. + /hei/{heiId}/course/{id}/instance: + get: + tags: + - Course instance + summary: GET /hei/{heiId}/course/{id}/instance + description: | + This endpoint lists all _Course instances_ filtered by _Course_. + operationId: getCourseInstances + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + - name: id + in: path + description: The UUID of the _Course_ resource to filter by. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: + - application/vnd.api+json + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CourseInstanceCollection' + example: + jsonapi: + version: '1.1' + meta: + links: + self: + href: http://jsonapi.org/format/1.1/ + data: + - type: instance + id: 13579bdf-0246-8ace-1357-9bdf02468ace + attributes: + lastModified: '2025-09-01T12:00:00Z' + relationships: + course: + data: + type: course + id: aabbccdd-eeff-1122-3344-556677889900 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900/instance + '404': + description: Endpoint not available. + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/Error' + example: + jsonapi: + version: '1.1' + meta: + links: + self: + href: http://jsonapi.org/format/1.1/ + errors: + - status: '404' + title: Endpoint not available. + /hei/{heiId}/instance/{id}: + get: + tags: + - Course instance + summary: GET /hei/{heiId}/instance/{id} + description: | + This endpoint exposes information about a _Course instance_. + operationId: getCourseInstanceByUuid + parameters: + - name: heiId + in: path + description: The SCHAC code of the Institution. + required: true + schema: + type: string + format: hostname + - name: id + in: path + description: The UUID of the _Course instance_ resource. + required: true + schema: + type: string + format: uuid + responses: + '200': + description: OK + headers: + Content-Type: + description: HTTP Content-Type representation header. + schema: + type: string + enum: + - application/vnd.api+json + content: + application/vnd.api+json: + schema: + $ref: '#/components/schemas/CourseInstanceResource' + example: + jsonapi: + version: '1.1' + meta: + links: + self: + href: http://jsonapi.org/format/1.1/ + data: + type: instance + id: 13579bdf-0246-8ace-1357-9bdf02468ace + attributes: + startDate: '2025-02-01' + endDate: '2025-06-30' + academicTermId: 2025/2026-2/2 + ects: 7.5 + elmAssessmentType: + - 3484bd7e51 + - 6e6cb2cc78 + elmLearningActivityType: + - ff436ea7c9 + - 3c8bd58d62 + elmLearningOpportunityType: + - 05053c1cbe + elmModeOfLearning: + - e92d221e4d + engagementHours: 42 + languageOfInstruction: + - en + lastModified: '2025-09-01T12:00:00Z' + relationships: + course: + data: + type: course + id: aabbccdd-eeff-1122-3344-556677889900 + links: + self: + href: http://example.com/occapi/v2/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + href: http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace links: self: - href: http://example.com/occapi/v1/hei/domain.tld/course/aabbccdd-eeff-1122-3344-556677889900 + href: http://example.com/occapi/v2/hei/domain.tld/instance/13579bdf-0246-8ace-1357-9bdf02468ace '404': description: Resource not found. content: @@ -1071,11 +1461,11 @@ paths: $ref: '#/components/schemas/Error' example: jsonapi: - version: '1.0' + version: '1.1' meta: links: self: - href: http://jsonapi.org/format/1.0/ + href: http://jsonapi.org/format/1.1/ errors: - status: '404' title: Resource not found. @@ -1115,7 +1505,116 @@ components: description: | JSON:API version supported by the server. - http://jsonapi.org/format/1.0/ + http://jsonapi.org/format/1.1/ + Lang: + type: + - string + - null + minLength: 2 + description: | + IETF BCP 47 language tag. + + Language tags allow to specify languages and their variations on script, region, etc. + + **Usage** + + - `el` for Greek + - `el-Latn` for Greek in Latin script. + - `el-CY` for Cypriot Greek + - `el-Latn-CY` for Cypriot Greek in Latin script. + + **References** + + - [Current specification](https://www.rfc-editor.org/info/bcp47) + - [Language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry) + StringWithOptionalLang: + type: object + required: + - string + properties: + string: + type: string + minLength: 1 + description: Text value. + lang: + $ref: '#/components/schemas/Lang' + HttpWithOptionalLang: + type: object + required: + - uri + properties: + uri: + type: string + format: uri + description: URL + lang: + $ref: '#/components/schemas/Lang' + LinksResource: + type: object + description: Hypermedia link to the **canonical path** of this resource. + required: + - href + properties: + href: + type: string + format: uri + LinksInstitutionCollection: + type: object + description: | + Hypermedia link to the _Institution_ collection covered by this server. + required: + - href + properties: + href: + type: string + format: uri + ServerData: + type: object + description: Information about the API server. + required: + - type + - id + - attributes + - links + properties: + type: + type: string + description: JSON:API resource type. + enum: + - server + id: + type: string + description: UUID v4 + format: uuid + attributes: + type: object + description: JSON:API _attributes_ object. + required: + - serverName + properties: + serverName: + type: array + minItems: 1 + description: Server name with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' + termsOfService: + type: array + minItems: 1 + description: URL for Terms of service with optional language code. + items: + $ref: '#/components/schemas/HttpWithOptionalLang' + links: + type: object + description: JSON:API _links_ object. + required: + - self + - hei + properties: + self: + $ref: '#/components/schemas/LinksResource' + hei: + $ref: '#/components/schemas/LinksInstitutionCollection' LinksSelf: type: object description: Hypermedia link to the current path. @@ -1129,30 +1628,21 @@ components: type: object description: Available endpoints and metadata. required: - - links + - data properties: jsonapi: $ref: '#/components/schemas/Jsonapi' + data: + $ref: '#/components/schemas/ServerData' meta: type: object description: Optional metadata. links: type: object description: JSON:API _links_ object. - required: - - hei properties: self: $ref: '#/components/schemas/LinksSelf' - hei: - type: object - description: Hypermedia link to the [Institution collection](#tag/Institution). - required: - - href - properties: - href: - type: string - format: uri Error: type: object description: JSON:API `errors` object. @@ -1186,40 +1676,31 @@ components: parameter: type: string description: Which URI query parameter caused the error. - Lang: - type: - - string - - null - description: | - Language code in [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. - - Optionally the script can be indicated in [ISO 15924](https://en.wikipedia.org/wiki/ISO_15924#List_of_codes) format. - - e.g. `el` for Greek, `el-Latn` for Greek in Latin script. - StringWithOptionalLang: + LinksOunitCollection: type: object + description: | + Hypermedia link to the _Organisational Unit_ collection associated with this + resource. required: - - string + - href properties: - string: + href: type: string - description: Value - lang: - $ref: '#/components/schemas/Lang' - HttpWithOptionalLang: + format: uri + LinksProgrammeCollection: type: object + description: | + Hypermedia link to the _Programme_ collection associated with this resource. required: - - uri + - href properties: - uri: + href: type: string format: uri - description: Value - lang: - $ref: '#/components/schemas/Lang' - LinksResource: + LinksCourseCollection: type: object - description: Hypermedia link to the **canonical path** of this resource. + description: | + Hypermedia link to the _Course_ collection associated with this resource. required: - href properties: @@ -1251,15 +1732,17 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - hei id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. + description: JSON:API resource ID; **must match** `heiId`. format: uuid attributes: type: object @@ -1267,19 +1750,29 @@ components: required: - title - heiId + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' - abbreviation: - type: string - description: Most widely recognized abbreviation. heiId: type: string description: The SCHAC code of the Institution. format: hostname + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' url: type: array description: External URL with optional language code. @@ -1293,6 +1786,12 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + ounit: + $ref: '#/components/schemas/LinksOunitCollection' + programme: + $ref: '#/components/schemas/LinksProgrammeCollection' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. @@ -1304,7 +1803,6 @@ components: description: JSON:API _Institution_ resource. required: - data - - links properties: jsonapi: $ref: '#/components/schemas/Jsonapi' @@ -1314,15 +1812,17 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - hei id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. + description: JSON:API resource ID; **must match** `heiId`. format: uuid attributes: type: object @@ -1330,19 +1830,29 @@ components: required: - title - heiId + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' - abbreviation: - type: string - description: Most widely recognized abbreviation. heiId: type: string description: The SCHAC code of the Institution. format: hostname + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' url: type: array description: External URL with optional language code. @@ -1356,52 +1866,18 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + ounit: + $ref: '#/components/schemas/LinksOunitCollection' + programme: + $ref: '#/components/schemas/LinksProgrammeCollection' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. properties: self: $ref: '#/components/schemas/LinksResource' - ounit: - type: object - description: | - Hypermedia link to the _Organisational Units_ collection associated to this resource. - - **Recommended:** separate any collections by _Organisational Unit_ in order to avoid large HTTP responses. - - The resource collection links for _Programmes_ and _Courses_ shown below can also be implemented at the _Organisational Unit_ level. - required: - - href - properties: - href: - type: string - format: uri - programme: - type: object - description: | - Hypermedia link to the _Programmes_ collection associated to this resource. - - **Recommended:** separate this collection by _Organisational Unit_ in order to avoid large HTTP responses. - - The resource collection link for _Courses_ shown below can also be implemented at the _Programme_ level. - required: - - href - properties: - href: - type: string - format: uri - course: - type: object - description: | - _**Discouraged!**_ Hypermedia link to the _Courses_ collection associated to this resource. - - **Recommended:** separate this collection by _Programme_ or by _Organisational Unit_ in order to avoid large HTTP responses. - required: - - href - properties: - href: - type: string - format: uri OunitCollection: type: object description: JSON:API collection of _Organisational Unit_ resources. @@ -1418,15 +1894,17 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - ounit id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. **Must** match `ounitId`. format: uuid attributes: type: object @@ -1434,18 +1912,27 @@ components: required: - title - ounitId + - lastModified properties: title: type: array description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' - abbreviation: - type: string - description: Most widely recognized abbreviation. ounitId: type: string - description: Unique identifier within the Institution. Can be a UUID. + description: Unique identifier within the Institution. + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' ounitCode: type: string description: Human readable code identifying the Organisational Unit. @@ -1462,6 +1949,10 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + programme: + $ref: '#/components/schemas/LinksProgrammeCollection' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. @@ -1473,7 +1964,6 @@ components: description: JSON:API _Organisational Unit_ resource. required: - data - - links properties: jsonapi: $ref: '#/components/schemas/Jsonapi' @@ -1483,15 +1973,17 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - ounit id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. **Must** match `ounitId`. format: uuid attributes: type: object @@ -1499,18 +1991,27 @@ components: required: - title - ounitId + - lastModified properties: title: type: array description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' - abbreviation: - type: string - description: Most widely recognized abbreviation. ounitId: type: string - description: Unique identifier within the Institution. Can be a UUID. + description: Unique identifier within the Institution. + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + abbreviation: + type: array + description: Most widely recognized abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' ounitCode: type: string description: Human readable code identifying the Organisational Unit. @@ -1527,34 +2028,57 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + programme: + $ref: '#/components/schemas/LinksProgrammeCollection' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. properties: self: $ref: '#/components/schemas/LinksResource' - programme: - type: object - description: | - Hypermedia link to the _Programmes_ collection associated to this resource. + EqfLevelProvided: + type: integer + minimum: 5 + maximum: 8 + description: | + European Qualifications Framework (EQF) level provided to the learner + upon completing the Programme. - The resource collection link for _Courses_ shown below can also be implemented at the _Programme_ level. - required: - - href - properties: - href: - type: string - format: uri - course: - type: object - description: | - Hypermedia link to the _Courses_ collection associated to this resource. - required: - - href - properties: - href: - type: string - format: uri + **Usage** + + - EQF level **5** for short cycle Programmes; + - EQF level **6** for first cycle Programmes (i.e. Bachelor's degree); + - EQF level **7** for short cycle Programmes (i.e. Master's degree); + - EQF level **8** for short cycle Programmes (i.e. Doctorate). + + **References** + + [European Qualifications Framework - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/eqf/25831c2) + LanguageOfInstruction: + type: array + minItems: 1 + description: | + IETF BCP 47 language tag. + + Language tags allow to specify languages and their variations on script, + region, etc. + + **Usage** + + - `el` for Greek + - `el-Latn` for Greek in Latin script. + - `el-CY` for Cypriot Greek + - `el-Latn-CY` for Cypriot Greek in Latin script. + + **References** + + - [Current specification](https://www.rfc-editor.org/info/bcp47) + - [Language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry) + items: + type: string + minLength: 2 MultilineStringWithOptionalLang: type: object required: @@ -1562,9 +2086,86 @@ components: properties: multiline: type: string - description: Value + minLength: 1 + description: Text value, which may contain markup. lang: $ref: '#/components/schemas/Lang' + ElmLearningOpportunityTypeProgramme: + type: array + description: | + **Learning opportunity type** as defined in the European Learning Model (ELM). + + _Note_: limited to the items in the controlled vocabulary that may apply + to Programmes. + + **Usage** + + - `79343569f3` represents _Educational programme_ + - `0f7dac46ca` represents _Programme module_ + - `74a4a268e8` represents _Short learning programme_ + + **References** + + [Learning opportunity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-opportunity/25831c2) + items: + type: string + enum: + - 79343569f3 + - 0f7dac46ca + - 74a4a268e8 + ElmLearningScheduleType: + type: array + description: | + **Learning schedule type** as defined in the European Learning Model (ELM). + + **Usage** + + - `72a0ab92fa` represents _Full time_ + - `f230bae523` represents _Part time intensive_ + - `67395e6b5a` represents _Part time light_ + + **References** + + [Learning schedule type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-schedule/25831c2) + items: + type: string + enum: + - 72a0ab92fa + - f230bae523 + - 67395e6b5a + ElmModeOfLearningAndAssessment: + type: array + description: "**Mode of learning and assessment** as defined in the European Learning\n Model (ELM).\n\n**Usage**\n\n- `e92d221e4d` represents\t_Blended_\n- `c_3a90b26d` represents\t_Hybrid_\n- `920fbb3cbe` represents\t_Online_\n- `9191af2ed9` represents\t_Presential_\n- `7813801c77` represents\t_Project based_\n- `ed4c557045` represents\t_Research-Lab based_\n- `729f3bed4b` represents\t_Workbased_\n\n**References**\n\n[Mode of learning and assessment - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-assessment/25831c2)\n" + items: + type: string + enum: + - e92d221e4d + - c_3a90b26d + - 920fbb3cbe + - 9191af2ed9 + - 7813801c77 + - ed4c557045 + - 729f3bed4b + ProgrammeLength: + type: string + pattern: ^\d{1,2}\/\d$ + description: | + Length of the Programme in **number of academic terms**. + + The first numeric component matching `\d{1,2}` indicates the total + number of academic terms, while the second component matching `\d` + indicates the fraction of a full academic year corresponding to a + single academic term. + + **Usage** + + - `6/2` indicates six (6) semesters (1/2) equivalent to three full + academic years; + - `7/2` indicates seven (7) semesters (1/2) equivalent to three and a + half academic years; + - `9/3` indicates nine (9) trimesters (1/3) equivalent to three full + academic years; + - `3/1` indicates three (3) full years (1/1) absent a division in terms. ProgrammeCollection: type: object description: JSON:API collection of _Programme_ resources. @@ -1587,70 +2188,105 @@ components: type: type: string description: JSON:API resource type. + enum: + - programme id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. - format: uuid + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. attributes: type: object description: JSON:API _attributes_ object. required: - title - code - - description - ects - eqfLevelProvided - - iscedCode - languageOfInstruction - - length + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' code: type: string + minLength: 1 description: Human readable code identifying the Programme. - description: - type: array - description: Description with optional language code. - items: - $ref: '#/components/schemas/MultilineStringWithOptionalLang' ects: type: integer + minimum: 0 description: Number of ECTS credits required to complete the Programme. eqfLevelProvided: - type: integer - minimum: 5 - maximum: 8 - description: | - [EQF Level](https://europa.eu/europass/en/description-eight-eqf-levels) - provided to the learner upon completing the Programme. - iscedCode: - type: string - description: | - [ISCED-F code](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) - describing the field of education of the Programme. + $ref: '#/components/schemas/EqfLevelProvided' languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + description: + type: array + minItems: 1 + description: Description with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + learningOutcomes: + type: array + minItems: 1 + description: Learning outcomes with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + abbreviation: + type: array + description: Abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeProgramme' + elmLearningScheduleType: + $ref: '#/components/schemas/ElmLearningScheduleType' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' + iscedCode: + type: array + minItems: 1 description: | - Language code in - [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. + ISCED-F code describing the field of education of the Programme. + + Multiple values are allowed in order to support multidisplinary + Programmes. - Optionally the country locale can be indicated in - [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format. + **References** - e.g. `pt` for Portuguese, `pt-PT` for European Portuguese. + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 length: - type: integer - minimum: 1 - description: Length of the Programme in **years**. + $ref: '#/components/schemas/ProgrammeLength' url: type: array description: External URL with optional language code. items: $ref: '#/components/schemas/HttpWithOptionalLang' + validSince: + type: string + format: date + description: | + The first date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + validUntil: + type: string + format: date + description: | + The last date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). links: type: object description: JSON:API _links_ object. @@ -1659,6 +2295,8 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. @@ -1670,7 +2308,6 @@ components: description: JSON:API _Programme_ resource. required: - data - - links properties: jsonapi: $ref: '#/components/schemas/Jsonapi' @@ -1680,76 +2317,111 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - programme id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. - format: uuid + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. attributes: type: object description: JSON:API _attributes_ object. required: - title - code - - description - ects - eqfLevelProvided - - iscedCode - languageOfInstruction - - length + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' code: type: string + minLength: 1 description: Human readable code identifying the Programme. - description: - type: array - description: Description with optional language code. - items: - $ref: '#/components/schemas/MultilineStringWithOptionalLang' ects: type: integer + minimum: 0 description: Number of ECTS credits required to complete the Programme. eqfLevelProvided: - type: integer - minimum: 5 - maximum: 8 - description: | - [EQF Level](https://europa.eu/europass/en/description-eight-eqf-levels) - provided to the learner upon completing the Programme. - iscedCode: - type: string - description: | - [ISCED-F code](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) - describing the field of education of the Programme. + $ref: '#/components/schemas/EqfLevelProvided' languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: type: string + format: date-time description: | - Language code in - [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + description: + type: array + minItems: 1 + description: Description with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + learningOutcomes: + type: array + minItems: 1 + description: Learning outcomes with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + abbreviation: + type: array + description: Abbbreviation with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeProgramme' + elmLearningScheduleType: + $ref: '#/components/schemas/ElmLearningScheduleType' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' + iscedCode: + type: array + minItems: 1 + description: | + ISCED-F code describing the field of education of the Programme. + + Multiple values are allowed in order to support multidisplinary + Programmes. - Optionally the country locale can be indicated in - [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format. + **References** - e.g. `pt` for Portuguese, `pt-PT` for European Portuguese. + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 length: - type: integer - minimum: 1 - description: Length of the Programme in **years**. + $ref: '#/components/schemas/ProgrammeLength' url: type: array description: External URL with optional language code. items: $ref: '#/components/schemas/HttpWithOptionalLang' + validSince: + type: string + format: date + description: | + The first date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + validUntil: + type: string + format: date + description: | + The last date in which the Programme was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). links: type: object description: JSON:API _links_ object. @@ -1758,52 +2430,151 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + course: + $ref: '#/components/schemas/LinksCourseCollection' links: type: object description: JSON:API _links_ object. properties: self: $ref: '#/components/schemas/LinksResource' - course: - type: object - description: | - Hypermedia link to the _Courses_ collection associated to this resource. - required: - - href - properties: - href: - type: string - format: uri + ElmAssessmentType: + type: array + description: | + **Assessment type** as defined in the European Learning Model (ELM). + + **Usage** + + - `de4d165a6c` represents _artefact assessment_; + - `3484bd7e51` represents _continuous evaluation_; + - `56539a6507` represents _group performance_; + - `c_4f874951` represents _Guided self-assessment_; + - `7331eb4762` represents _level of attendance_; + - `2939dae15f` represents _marked assignment_; + - `d30284d7df` represents _oral examination_; + - `19a2e5e671` represents _peer assessment_; + - `812e3b0ae1` represents _peer review_; + - `812e3b0ae1` represents _peer review_; + - `4f03b91c0e` represents _portfolio_; + - `6a4db9f11d` represents _practical assessment_; + - `c_04b30a72` represents _Presentation_; + - `c4256a2726` represents _problem based learning_; + - `795dac4096` represents _project work_; + - `b1b68f6735` represents _quiz_; + - `c_2b3bd410` represents _Self-assessment_; + - `6e6cb2cc78` represents _written examination_. + + **References** + + [Assessment type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/assessment/25831c2) + items: + type: string + enum: + - de4d165a6c + - 3484bd7e51 + - 56539a6507 + - c_4f874951 + - 7331eb4762 + - 2939dae15f + - d30284d7df + - 19a2e5e671 + - 812e3b0ae1 + - 812e3b0ae1 + - 4f03b91c0e + - 6a4db9f11d + - c_04b30a72 + - c4256a2726 + - 795dac4096 + - b1b68f6735 + - c_2b3bd410 + - 6e6cb2cc78 + ElmLearningActivityType: + type: array + description: | + **Learning activity type** as defined in the European Learning Model (ELM). + + **Usage** + + - `d46a826a39` represents _apprenticeship_; + - `ff436ea7c9` represents _classroom coursework_; + - `bf2e3a7bae` represents _e-learning coursework_; + - `fd33e234ae` represents _educational programme_; + - `bf5588ff84` represents _internship_; + - `4357e0e681` represents _job experience_; + - `3c8bd58d62` represents _lab / simulation / practice coursework_; + - `c_5665a0ad` represents _mentoring and monitoring activity_; + - `a7e556215a` represents _research_; + - `b660f5dcea` represents _self-motivated study_; + - `59eaf34fab` represents _volunteering_; + - `efff75e10a` represents _workshop, seminar or conference_. + + **References** + + [Learning activity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-activity/25831c2) + items: + type: string + enum: + - d46a826a39 + - ff436ea7c9 + - bf2e3a7bae + - fd33e234ae + - bf5588ff84 + - 4357e0e681 + - 3c8bd58d62 + - c_5665a0ad + - a7e556215a + - b660f5dcea + - 59eaf34fab + - efff75e10a + ElmLearningOpportunityTypeCourse: + type: array + description: "**Learning opportunity type** as defined in the European Learning Model (ELM).\n\n_Note_: limited to the items in the controlled vocabulary that may apply\n to Courses.\n\n**Usage**\n\n- `63f9f6180c` represents\t_Apprenticeship_;\n- `c_170b037d` represents\t_Challenge_;\n- `7e1ac538db` represents\t_Class_;\n- `05053c1cbe` represents\t_Course_;\n- `77b99de990` represents\t_Internship_;\n- `17744a2647` represents\t_MOOC_;\n- `11252a5207` represents\t_Mentoring_;\n- `8b965da2d4` represents\t_Service learning_;\n- `65a4cf5de2` represents\t_Study visit_;\n- `b2434ca358` represents\t_Thesis_.\n\n**References**\n\n[Learning opportunity type - EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/concept-scheme/-/resource?uri=http://data.europa.eu/snb/learning-opportunity/25831c2)\n" + items: + type: string + enum: + - 63f9f6180c + - c_170b037d + - 7e1ac538db + - 05053c1cbe + - 77b99de990 + - 17744a2647 + - 11252a5207 + - 8b965da2d4 + - 65a4cf5de2 + - b2434ca358 + LocalClassification: + type: array + description: | + Indicates a local (national or other) classification system for fields + of study, followed by the applicable value (or code) in that system. + + Multiple values are allowed in order to support multidisplinary + Courses. + items: + type: object + required: + - classificationSystem + - classificationValue + properties: + classificationSystem: + type: string + description: Classification system + minLength: 1 + classificationValue: + type: string + description: Classification value + minLength: 1 CourseMeta: type: object description: | JSON:API _meta_ object containing information about the relation between a Course and all or specific Programmes. properties: - global: - type: object - description: Global rules that apply to all Programmes by default. - required: - - eqfLevel - - year - properties: - eqfLevel: - type: integer - minimum: 5 - maximum: 8 - description: | - [EQF Level](https://europa.eu/europass/en/description-eight-eqf-levels) - of the Programmes to which the global rule applies. - year: - type: string - description: | - Year of the Programme in which the Course is delivered. - - e.g. `2/3` for the second of three years. - pattern: '[1-9]/[1-9]' - programme: + relatedProgramme: type: array - description: Rules that apply to specific Programmes. + description: |- + Describes the inclusion of a Course in a specific Programme. + Any Programme indicated here **must** also be indicated in the `relationships` object. items: type: object required: @@ -1814,7 +2585,6 @@ components: programmeId: type: string description: ID of the _Programme_ resource. - format: uuid mandatoryCourse: type: boolean description: Whether the Course is mandatory within the Programme. @@ -1823,8 +2593,104 @@ components: description: | Year of the Programme in which the Course is delivered. - e.g. `2/3` for the second of three years. - pattern: '[1-9]/[1-9]' + **Usage** + + - `2/3` means the Course is delivered in the second (2) of the three + (3) years of the Programme duration; + - `0/3` means the Course may be completed _at any point_ during the + three (3) years of the Programme duration; + - `4/4` may also refer to the fourth (4) year in a Programme with a + length of three and a half years (3.5) which must be rounded up in + the current context. + pattern: \d\/[1-9] + CourseRelationships: + type: object + description: | + JSON:API _relationships_ object. + properties: + prerequisiteCourse: + type: array + description: | + Another Course that **must** be completed before enrollment in the present + Course is allowed. + + If the prerequisites for the present Course cannot be matched to a single + Course (or multiple Courses), use the `prerequisites` data attribute for + a more detailed description. + items: + type: object + required: + - data + - links + properties: + data: + type: object + description: Prerequisite Course data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: + - course + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: '#/components/schemas/LinksResource' + relatedProgramme: + type: array + description: | + Any Programme which includes the present Course in its curricular plan. + + This **must** match all related Programmes indicated in the `meta` object. + items: + type: object + required: + - data + - links + properties: + data: + type: object + description: Related Programme data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: + - programme + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: '#/components/schemas/LinksResource' + LinksCourseInstanceCollection: + type: object + description: | + Hypermedia link to the _Course instance_ collection associated with this resource. + required: + - href + properties: + href: + type: string + format: uri CourseCollection: type: object description: JSON:API collection of _Course_ resources. @@ -1841,97 +2707,138 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. + enum: + - course id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. - format: uuid + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. attributes: type: object description: JSON:API _attributes_ object. required: - title - code - - description - - learningOutcomes - - academicTerm - ects - languageOfInstruction - - iscedCode + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' code: type: string + minItems: 1 description: Human readable code identifying the Course. + ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. + languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). description: type: array + minItems: 1 description: Description with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' learningOutcomes: type: array + minItems: 1 description: Learning outcomes with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' academicTerm: - type: string + type: array description: | Academic term in which the Course is delivered. - e.g. `1/2` for first semester, - `2/2` for second semester, - `1/1` for the full academic year. - pattern: '[1-9]/[1-9]' - ects: - type: integer - description: Number of ECTS credits provided to the learner upon completing the Course. - languageOfInstruction: - type: string - description: | - Language code in - [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. + Multiple values are allowed in order to support Courses delivered in + in more than one academic term throughout an academic year. - Optionally the country locale can be indicated in - [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format. + **Usage** - e.g. `pt` for Portuguese, `pt-PT` for European Portuguese. + - `1/2` indicates first (1) semester (1/2); + - `2/3` indicates second (2) trimester (1/3); + - `1/1` indicates full academic year. + items: + type: string + pattern: ^[1-9]\/[1/9]$ + elmAssessmentType: + $ref: '#/components/schemas/ElmAssessmentType' + elmLearningActivityType: + $ref: '#/components/schemas/ElmLearningActivityType' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeCourse' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' iscedCode: - type: string + type: array description: | - [ISCED-F code](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) - describing the field of education of the Course. + ISCED-F code describing the field of education of the Course. - This may be left empty **if** a value for `subjectArea` or `otherCategorization` is provided. - subjectArea: - type: string - description: | - Erasmus subject area code describing the field of education of the Course. - otherCategorization: - type: string + Multiple values are allowed in order to support multidisplinary + Courses. + + **References** + + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) + items: + type: string + minLength: 2 + maxLength: 4 + localClassification: + $ref: '#/components/schemas/LocalClassification' + restrictedToLocalStudents: + type: boolean description: | - Any other term used internally to describe the field of education of the Course. - unavailableForIncomingMobility: + Return `true` when enrollment in the Course is restricted to students + enrolled at this Institution. + restrictedToAllianceStudents: type: boolean description: | - Return `true` when the Course is not available for incoming exchange students to enroll. - - Unless explicitly stated, client implementations should assume this as `false`. + Return `true` when enrollment in the Course is restricted to students + enrolled at a partner Institution in the same University Alliance. url: type: array description: External URL with optional language code. items: $ref: '#/components/schemas/HttpWithOptionalLang' + deprecated: + type: boolean + description: | + Return `true` if a Course will no longer be delivered, or there is no + expectation that it will be delivered in the foreseeable future. + + **Deprecate, do not delete!** + + Institutions **must** keep a permanent record of all Courses ever delivered + so that they may be dereferenced from _Course instances_. + + Servers **must** omit deprecated Courses from Course collections (unless + `deprecated` is used as a filter). + + Servers **must** provide deprecated Course data via its **canonical path**. meta: $ref: '#/components/schemas/CourseMeta' + relationships: + $ref: '#/components/schemas/CourseRelationships' links: type: object description: JSON:API _links_ object. @@ -1940,6 +2847,8 @@ components: properties: self: $ref: '#/components/schemas/LinksResource' + instance: + $ref: '#/components/schemas/LinksCourseInstanceCollection' links: type: object description: JSON:API _links_ object. @@ -1960,15 +2869,15 @@ components: required: - type - id - - links - attributes + - links properties: type: type: string description: JSON:API resource type. id: type: string - description: JSON:API resource ID; UUID v4 is **recommended**, but any string that is unique within the realm of the Institution may be used. + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. format: uuid attributes: type: object @@ -1976,111 +2885,465 @@ components: required: - title - code - - description - - learningOutcomes - - academicTerm - ects - languageOfInstruction - - iscedCode + - lastModified properties: title: type: array + minItems: 1 description: Title with optional language code. items: $ref: '#/components/schemas/StringWithOptionalLang' code: type: string + minItems: 1 description: Human readable code identifying the Course. + ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. + languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). description: type: array + minItems: 1 description: Description with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' learningOutcomes: type: array + minItems: 1 description: Learning outcomes with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' academicTerm: - type: string + type: array description: | Academic term in which the Course is delivered. - e.g. `1/2` for first semester, - `2/2` for second semester, - `1/1` for the full academic year. - pattern: '[1-9]/[1-9]' - ects: - type: integer - description: Number of ECTS credits provided to the learner upon completing the Course. - languageOfInstruction: - type: string - description: | - Language code in - [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. + Multiple values are allowed in order to support Courses delivered in + in more than one academic term throughout an academic year. - Optionally the country locale can be indicated in - [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) format. + **Usage** - e.g. `pt` for Portuguese, `pt-PT` for European Portuguese. - iscedCode: - type: string - description: | - [ISCED-F code](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) - describing the field of education of the Course. - - This may be left empty **if** a value for `subjectArea` or `otherCategorization` is provided. - subjectArea: - type: string - description: | - Erasmus subject area code describing the field of education of the Course. - otherCategorization: - type: string - description: | - Any other term used internally to describe the field of education of the Course. - unavailableForIncomingMobility: - type: boolean + - `1/2` indicates first (1) semester (1/2); + - `2/3` indicates second (2) trimester (1/3); + - `1/1` indicates full academic year. + items: + type: string + pattern: ^[1-9]\/[1/9]$ + assessmentMethod: + type: array description: | - Return `true` when the Course is not available for incoming exchange students to enroll. + Assessment method with optional language code. - Unless explicitly stated, client implementations should assume this as `false`. - url: - type: array - description: External URL with optional language code. + **Note:** It is preferable to use `elmAssessmentType` instead. items: - $ref: '#/components/schemas/HttpWithOptionalLang' + $ref: '#/components/schemas/MultilineStringWithOptionalLang' bibliography: type: array description: Bibliography with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' + courseAvailability: + type: array + description: Course availability with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' courseContent: type: array description: Course content with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' - prerequisites: + elmAssessmentType: + $ref: '#/components/schemas/ElmAssessmentType' + elmLearningActivityType: + $ref: '#/components/schemas/ElmLearningActivityType' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeCourse' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' + iscedCode: type: array - description: Prerequisites with optional language code. + description: | + ISCED-F code describing the field of education of the Course. + + Multiple values are allowed in order to support multidisplinary + Courses. + + **References** + + [Fields of education and training 2013](http://uis.unesco.org/sites/default/files/documents/international-standard-classification-of-education-fields-of-education-and-training-2013-detailed-field-descriptions-2015-en.pdf) + (PDF) items: - $ref: '#/components/schemas/MultilineStringWithOptionalLang' - courseAvailability: + type: string + minLength: 2 + maxLength: 4 + localClassification: + $ref: '#/components/schemas/LocalClassification' + prerequisites: type: array - description: Course availability with optional language code. + description: Prerequisites with optional language code. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' + restrictedToLocalStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at this Institution. + restrictedToAllianceStudents: + type: boolean + description: | + Return `true` when enrollment in the Course is restricted to students + enrolled at a partner Institution in the same University Alliance. teachingMethod: type: array - description: Teaching method with optional language code. + description: | + Teaching method with optional language code. + + **Note:** It is preferable to use `elmLearningActivityType` instead. items: $ref: '#/components/schemas/MultilineStringWithOptionalLang' - assessmentMethod: + url: type: array - description: Assessment method with optional language code. + description: External URL with optional language code. items: - $ref: '#/components/schemas/MultilineStringWithOptionalLang' + $ref: '#/components/schemas/HttpWithOptionalLang' + deprecated: + type: boolean + description: | + Return `true` if a Course will no longer be delivered, or there is no + expectation that it will be delivered in the foreseeable future. + + **Deprecate, do not delete!** + + Institutions **must** keep a permanent record of all Courses ever delivered + so that they may be dereferenced from _Course instances_. + + Servers **must** omit deprecated Courses from Course collections (unless + `deprecated` is used as a filter). + + Servers **must** provide deprecated Course data via its **canonical path**. meta: $ref: '#/components/schemas/CourseMeta' + relationships: + $ref: '#/components/schemas/CourseRelationships' + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: '#/components/schemas/LinksResource' + instance: + $ref: '#/components/schemas/LinksCourseInstanceCollection' + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: '#/components/schemas/LinksResource' + AcademicTermId: + type: string + description: | + The academic term ID, as defined by [Erasmus Without Paper](#), + combines the exact academic year with the (generic) academic term as seen + at the Course level. + + **Usage** + + - The exact academic year component is described as `yearStart/yearEnd`; + - Wherever the academic year begins and ends in different calendar years, + the values of `yearStart` and `yearEnd` will be consecutive: `2025/2026`; + - Wherever the academic year begins and ends in the same calendar year, + the values of `yearStart` and `yearEnd` will be the same: `2026/2026`; + - The (generic) academic term component is taken from the [Course](); + - The resulting format is `YYYY/YYYY-t/T` i.e. `2025/2026-1/2` means the + **first** (1) **semester** (2) of the academic year **2025/2026**. + GradingScheme: + type: object + description: | + Grading scheme used at the Institution. + required: + - label + properties: + label: + type: array + description: Human readable label of the grading scheme with optional language code. + items: + $ref: '#/components/schemas/StringWithOptionalLang' + description: + type: array + description: Description of the grading scheme with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + ResultDistributionCategory: + type: object + description: | + _This describes a single range within the histogram._ + required: + - label + - count + properties: + label: + type: string + minLength: 1 + description: | + _The label of the histogram range. Should correspond to the grading scheme + which have been used. E.g. "C", or "20-30". If possible, the label + should be understandable in any language. If not, you should try to use + English._ + count: + type: integer + minimum: 0 + description: | + _The number of students whose grades fall within that category._ + ResultDistribution: + type: object + description: | + _Optional. Describes a histogram of results achieved by all the students of + this course instance (including the ones who have failed the course). Note + that labels of the histogram are not integers, e.g. they may contain ranges + (like "10-20", or "more than 150")._ + properties: + category: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/ResultDistributionCategory' + description: + type: array + description: | + Additional description of the histogram with optional language code. + items: + $ref: '#/components/schemas/MultilineStringWithOptionalLang' + CourseInstanceRelationships: + type: object + description: | + JSON:API _relationships_ object. + required: + - course + properties: + course: + type: object + description: | + The _Course_ resource the _Course instance_ refers to. + required: + - data + - links + properties: + data: + type: object + description: _Course_ data. + required: + - type + - id + properties: + type: + type: string + description: JSON:API resource type. + enum: + - course + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: '#/components/schemas/LinksResource' + CourseInstanceCollection: + type: object + description: JSON:API collection of _Course instance_ resources. + required: + - data + properties: + jsonapi: + $ref: '#/components/schemas/Jsonapi' + data: + type: array + description: List of _Course instance_ resources. + items: + type: object + required: + - type + - id + - attributes + - relationships + - links + properties: + type: + type: string + description: JSON:API resource type. + enum: + - instance + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. + attributes: + type: object + description: JSON:API _attributes_ object. + required: + - startDate + - endDate + - academicTermId + - ects + - languageOfInstruction + - lastModified + properties: + startDate: + type: string + format: date + description: | + The first date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + endDate: + type: string + format: date + description: | + The last date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + academicTermId: + $ref: '#/components/schemas/AcademicTermId' + ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. + languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + elmAssessmentType: + $ref: '#/components/schemas/ElmAssessmentType' + elmLearningActivityType: + $ref: '#/components/schemas/ElmLearningActivityType' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeCourse' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' + engagementHours: + type: float + description: Total number of engagement hours during the entire Instance. + minimum: 0 + gradingScheme: + $ref: '#/components/schemas/GradingScheme' + resultDistribution: + $ref: '#/components/schemas/ResultDistribution' + relationships: + $ref: '#/components/schemas/CourseInstanceRelationships' + links: + type: object + description: JSON:API _links_ object. + required: + - self + properties: + self: + $ref: '#/components/schemas/LinksResource' + links: + type: object + description: JSON:API _links_ object. + properties: + self: + $ref: '#/components/schemas/LinksCollection' + CourseInstanceResource: + type: object + description: JSON:API _Course instance_ resource. + required: + - data + properties: + jsonapi: + $ref: '#/components/schemas/Jsonapi' + data: + type: object + description: _Course instance_ resource data. + required: + - type + - id + - attributes + - relationships + - links + properties: + type: + type: string + description: JSON:API resource type. + enum: + - instance + id: + type: string + description: JSON:API resource ID; UUID v4 is **recommended**, but any value that is unique within the Institution may be used. + attributes: + type: object + description: JSON:API _attributes_ object. + required: + - startDate + - endDate + - academicTermId + - ects + - languageOfInstruction + - lastModified + properties: + startDate: + type: string + format: date + description: | + The first date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + endDate: + type: string + format: date + description: | + The last date in which the Course instance was offered, formatted as + [YYYY-MM-DD](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + academicTermId: + $ref: '#/components/schemas/AcademicTermId' + ects: + type: float + minimum: 0 + description: | + Number of ECTS credits awarded to the learner upon completing the Course. + languageOfInstruction: + $ref: '#/components/schemas/LanguageOfInstruction' + lastModified: + type: string + format: date-time + description: | + Time of latest change to this resource, formatted as + [YYYY-MM-DDThh:mm:ssZ](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6). + elmAssessmentType: + $ref: '#/components/schemas/ElmAssessmentType' + elmLearningActivityType: + $ref: '#/components/schemas/ElmLearningActivityType' + elmLearningOpportunityType: + $ref: '#/components/schemas/ElmLearningOpportunityTypeCourse' + elmModeOfLearning: + $ref: '#/components/schemas/ElmModeOfLearningAndAssessment' + engagementHours: + type: float + description: Total number of engagement hours during the entire Instance. + minimum: 0 + gradingScheme: + $ref: '#/components/schemas/GradingScheme' + resultDistribution: + $ref: '#/components/schemas/ResultDistribution' + relationships: + $ref: '#/components/schemas/CourseInstanceRelationships' links: type: object description: JSON:API _links_ object. diff --git a/templates/index.html b/templates/index.html index 6042553..04ab42a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -35,7 +35,7 @@ background-color: green; } .latest { - background-color: darkred; + background-color: orangered; }