From 02d5acac69888e31288abf958bbc8f652a49f426 Mon Sep 17 00:00:00 2001 From: Joost Diepenmaat Date: Wed, 22 Nov 2023 09:33:56 +0100 Subject: [PATCH 1/4] Rename to `apie`, remove eduhub-specific files Adjust makefile to allow building standalone `apie` binary for the local machine. --- .github/workflows/build.yaml | 2 +- .gitignore | 1 - Makefile | 21 +- README.md | 104 +- current_arch.clj | 17 + docs/specification-authors.md | 38 +- example-profiles/petstore.edn | 20 + example-profiles/petstore.openapi.json | 1225 ++ profiles/.keep | 0 profiles/included-profiles.txt | 2 - profiles/ooapi | 167 - profiles/ooapi.openapi.json | 10050 ---------------- profiles/rio | 57 - profiles/rio.openapi.json | 4273 ------- .../included_profiles.clj | 2 +- .../jomco/{eduhub_validator => apie}/main.clj | 8 +- .../{eduhub_validator => apie}/report.clj | 4 +- .../report/json.clj | 2 +- .../{eduhub_validator => apie}/spider.clj | 2 +- .../report/json_test.clj | 4 +- validate | 2 +- validate.bat | 2 +- 22 files changed, 1349 insertions(+), 14654 deletions(-) create mode 100644 current_arch.clj create mode 100644 example-profiles/petstore.edn create mode 100644 example-profiles/petstore.openapi.json create mode 100644 profiles/.keep delete mode 100644 profiles/included-profiles.txt delete mode 100644 profiles/ooapi delete mode 100644 profiles/ooapi.openapi.json delete mode 100644 profiles/rio delete mode 100644 profiles/rio.openapi.json rename src/nl/jomco/{eduhub_validator => apie}/included_profiles.clj (83%) rename src/nl/jomco/{eduhub_validator => apie}/main.clj (95%) rename src/nl/jomco/{eduhub_validator => apie}/report.clj (99%) rename src/nl/jomco/{eduhub_validator => apie}/report/json.clj (97%) rename src/nl/jomco/{eduhub_validator => apie}/spider.clj (99%) rename test/nl/jomco/{eduhub_validator => apie}/report/json_test.clj (86%) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 29d3216..0776cfc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -93,7 +93,7 @@ jobs: ./lib - name: Artifact name - run: echo filename=eduhub-validator-${{ needs.create_release.outputs.version }}-${{ matrix.arch }} >> $GITHUB_OUTPUT + run: echo filename=apie-${{ needs.create_release.outputs.version }}-${{ matrix.arch }} >> $GITHUB_OUTPUT id: artifact - name: Install clj runtime diff --git a/.gitignore b/.gitignore index d67bb65..a6abc0c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /.envrc /bin/ /lib/ -eduhub-validator* *.tar.gz /report.html /observations.edn diff --git a/Makefile b/Makefile index 501ebe0..f7604f6 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # # Expects the artifact to be in the format # -# `eduhub-validator-VERSION-ARCH.EXT +# `apie-VERSION-ARCH.EXT # # Where VERSION matches the current git tag (like `v0.0.1-SNAPSHOT`) # @@ -13,8 +13,8 @@ # babashka (variants of linux, windows and macos), see # https://github.com/babashka/babashka/releases # -# In other words, `make eduhub-validator-$VERSION-windows-amd64.zip` -# and `make eduhub-validator-$VERSION-macos-aarch64.tar.gz` will do +# In other words, `make apie-$VERSION-windows-amd64.zip` +# and `make apie-$VERSION-macos-aarch64.tar.gz` will do # what you expect as long as $VERSION is the currently tagged version BB:=bb @@ -25,9 +25,10 @@ BABASHKA_VERSION:=1.3.186-SNAPSHOT .PHONY: uberjar -exec_base_name=eduhub-validator +exec_base_name=apie release_name=$(exec_base_name)-$(version) source_files=$(shell find src assets profiles -type f) +current_arch=$(shell bb current_arch.clj) # uberjar is the babashka uberjar (not a java-compatible jar) uberjar=$(exec_base_name)-$(version)-standalone.jar @@ -35,11 +36,12 @@ uberjar=$(exec_base_name)-$(version)-standalone.jar uberjar: $(uberjar) $(uberjar): deps.edn bb.edn $(source_files) - $(BB) uberjar $@ -m nl.jomco.eduhub-validator.main + $(BB) uberjar $@ -m nl.jomco.apie.main release: $(binary_release) # for unixy systems + $(release_name)-%/$(exec_base_name): babashka-$(BABASHKA_VERSION)-%.tar.gz $(uberjar) mkdir -p $(dir $@) tar -zxO <$< >$@ @@ -64,3 +66,12 @@ $(release_name)-%.tar.gz: $(release_name)-%/$(exec_base_name) # for windows $(release_name)-%.zip: $(release_name)-%/$(exec_base_name).exe zip -r $@ $(basename $@) + +# build for local use, on windows +$(exec_base_name).exe: $(release_name)-$(current_arch)/$(exec_base_name).exe + cp $< $@ + +# build for local use, non-windows +$(exec_base_name): $(release_name)-$(current_arch)/$(exec_base_name) + echo $(current_arch) + cp $< $@ diff --git a/README.md b/README.md index 5c0a32d..99f12ac 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,61 @@ -# Eduhub API validator +# Apie 🙈 OpenAPI Service Validator 🙈 -A command-line tool to spider and validate [Open Education -API](https://openonderwijsapi.nl/) endpoints to ensure compatibility -with services in -[SURFeduhub](https://www.surf.nl/surfeduhub-veilig-uitwisselen-van-onderwijsdata). +A command-line tool to spider and validate API endpoints to ensure +compatibility with OpenAPI v3 specs. -This tool is intended for developers of OOAPI endpoints at educational -institutions or their software suppliers. +Apie takes an OpenAPI description of your service and crawls the +endpoints, evaluating the interactions as it goes. It then generates a +compact report containing all the validation issues found. -## Downloading a release +# For service developers -This repository contains the source code & configuration of the -validator. If you only need to run the builtin validations, download -the latest build for your platform from [the Releases -page](https://github.com/SURFnet/eduhub-validator/releases). +Use Apie to get quick and readable feedback during development. -The released builds contain a standalone binary `eduhub-validator` -that has the configuration for multiple OOAPI profiles builtin. +Run Apie from your automated tests to prevent regressions. -## For OOAPI endpoint developers +Apie helps you to validate that your service is behaving according to +spec. Apie is a free, open source, standalone tool that talks to your +service like any other HTTP client. If you have an OpenAPI v3 +specification for your API, you need minimal configuration to specify +seed points and rules. -The eduhub-validator binary contains a set of profiles which can be -used to validate an OpenAPI endpoint for specific use cases. +# For standards bodies -Endpoints are not required to implement every path in the -specification, +Use Apie to ensure adherence to your standards. -Validating an endpoint works in two steps: +When you're publishing specifications for others to implement, you +want to provide all the automated support you can. With Apie, you can +take your service description as a standard OpenAPI v3 document, add a +simple rule set and quickly evaluate any implementation to ensure +adherence! - - Spidering the endpoint and validating the responses. This will - create a large file with "observations"; a sequence of - request/response pairs and the associated validation issues. - - - Aggregating the observations into a readable HTML report. - -## Spidering an endpoint directly +# Usage ```sh -eduhub-validator --base-url https://your-endpoint/ +apie --profile example-profiles/petstore.edn \ + --base-url https://petstore3.swagger.io/api/v3 ``` -This will exhaustively index your endpoint paths, validate against the -default `rio` profile and write a report to `report.html` which can be -opened using any web browser. +This will spider the paths in the profile, validate against the +included openapi specification and write a report to `report.html` +which can be opened using any web browser. The intermediate validation results are written to `observations.edn`. This file is in [EDN format](https://github.com/edn-format/edn) which is similar to JSON and can be read as text, but it will probably be very large. -## Spidering via gateway - -To run the spider through the Eduhub gateway, you can use the -`--basic-auth` and `--headers` options: +See our [configuration documentation](./docs/specification-authors.md) +for more details. -```sh -eduhub-validator \ - --profile rio - --base-url https://gateway.test.surfeduhub.nl/ \ - --basic-auth USERNAME:PASS \ - --add-header 'x-route: endpoint=demo04.test.surfeduhub.nl' \ - --add-header 'accept: application/json; version=5' \ - --add-header 'x-envelope-response: false' -``` - -## Available Eduhub profiles +## Downloading a release -A few Eduhub profiles are available in the [profiles](./profiles) -directory and are built into the binary releases: +This repository contains the source code & example configuration of +Apie. If you only need to run the your own validations, download the +latest build for your platform from [the Releases +page](https://github.com/SURFnet/apie/releases). - - `ooapi` -- the full OOAPI v5 specification - - `rio` -- the RIO profile of OOAPI v5. - -The RIO profile defines the subset of the OOAPI that RIO Mapper -service requires. +The released builds contain a standalone binary `apie`. # Extending the validator @@ -90,10 +72,20 @@ requires Java and is slower to start. The `validator` script in the root of the repository will use Babashka if `bb` is on the PATH, and `clojure` otherwise. -## For specification authors +The Makefile can build a release for your current os: + +``` +make apie # on linux / macos +``` + +or + +``` +make apie.exe # on windows (untested) +``` -Information about writing specification profiles can be found in -[docs/specification-authors.md](./docs/specification-authors.md). +We build for all supported platforms on Github; see +`.github/workflows/build.yaml` for details. # Reporting vulnerabilities diff --git a/current_arch.clj b/current_arch.clj new file mode 100644 index 0000000..f15a295 --- /dev/null +++ b/current_arch.clj @@ -0,0 +1,17 @@ +(ns current-arch + (:require [clojure.string :as string])) + +(def systems + {"win" "windows" + "mac" "macos" + "linux" "linux"}) + +(def system + (let [n (-> (System/getProperty "os.name" "unknown") + (string/lower-case))] + (some (fn [[sub os]] + (when (string/index-of n sub) + os)) + systems))) + +(println (str system "-" (System/getProperty "os.arch" "unknown"))) diff --git a/docs/specification-authors.md b/docs/specification-authors.md index d47c1e5..48f9cd0 100644 --- a/docs/specification-authors.md +++ b/docs/specification-authors.md @@ -1,35 +1,16 @@ -# For Eduhub specification authors +# For OpenAPI specification authors -This document is intended for authors of the Open Education -Specification and related profiles. +This document is intended for authors of the OpenAPI specs and the +related profile configuration. Before writing your own profiles and rules take a look at the -available configuration files in the [profiles](../profiles) directory. - -# Profiles for different use cases - -The Open Education Specification has profiles for different consumers -(use cases). - -Currently, we have a two profiles: - -- `ooapi` - the profile for a complete OOAPI implementation -- `rio` - the minimum implementation needed for serving the RIO Consumer. - -We describe a profile as a set of rules for indexing specific paths, -plus a profile-specific OpenAPI specification (this is a subset of the -generic OOAPI OpenAPI spec). +available configuration files in the +[example-profiles](../example-profiles) directory. More examples can +be found in the [eduhub-validator +profiles](https://github.com/SURFnet/eduhub-validator/tree/master/profiles) # OpenAPI Specifications -OpenAPI specs subsets are created using -[merge-yaml-tree](https://git.sr.ht/~jomco/merge-yaml-tree). - -This tool takes two directory trees with YAML files and generates a -merged tree. This can be used to create subsets of the [Open -Education -Specification](https://github.com/open-education-api/specification/tree/master/v5). - The validator in this repository expects a JSON formatted single-file specification. To generate a JSON version of a YAML directory tree you can use the Redocly command line tool: @@ -40,9 +21,6 @@ npx @redocly/openapi-cli bundle --ext=json spec.yaml --force >profile.json Where `spec.yaml` is the root YAML document. -In this repository, the resulting JSON specifications are added to the -[profiles](../profiles) directory. - # Profile files An OpenAPI specification alone is not enough to index a service. The @@ -188,3 +166,5 @@ the spidering and rules implementation. [https://git.sr.ht/~jomco/openapi-v3-validator](https://git.sr.ht/~jomco/openapi-v3-validator) - the OpenAPI validation implementation. + +[https://github.com/SURFnet/eduhub-validator/](https://github.com/SURFnet/eduhub-validator/) - Apie builds for OpenOnderwijsAPI endpoints. diff --git a/example-profiles/petstore.edn b/example-profiles/petstore.edn new file mode 100644 index 0000000..02ce848 --- /dev/null +++ b/example-profiles/petstore.edn @@ -0,0 +1,20 @@ +{:openapi-spec "petstore.openapi.json" + :seeds + [{:method "get" + :path "/pet/findByStatus" + :query-params {"status" "pending"}} + {:method "get" + :path "/pet/findByStatus" + :query-params {"status" "available"}} + {:method "get" + :path "/pet/findByStatus" + :query-params {"status" "sold"}} + {:method "get" + :path "/store/inventory"}] + :rules + [{:match [[:request :method, "get"] + [:request :path "/pet/findByStatus"] + [:response :status 200] + [:response :body ?i "id" ?petId]] + :generates [{:method "get" + :path "/pet/{ ?petId }"}]}]} diff --git a/example-profiles/petstore.openapi.json b/example-profiles/petstore.openapi.json new file mode 100644 index 0000000..f2a33f1 --- /dev/null +++ b/example-profiles/petstore.openapi.json @@ -0,0 +1,1225 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "Swagger Petstore - OpenAPI 3.0", + "description": "This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0.17" + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + }, + "servers": [ + { + "url": "/api/v3" + } + ], + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + }, + { + "name": "user", + "description": "Operations about user" + } + ], + "paths": { + "/pet": { + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "Update an existing pet by Id", + "operationId": "updatePet", + "requestBody": { + "description": "Update an existent pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "Add a new pet to the store", + "operationId": "addPet", + "requestBody": { + "description": "Create a new pet in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": false, + "explode": true, + "schema": { + "type": "string", + "default": "available", + "enum": [ + "available", + "pending", + "sold" + ] + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": false, + "explode": true, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + }, + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + } + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "name", + "in": "query", + "description": "Name of pet that needs to be updated", + "schema": { + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Status of pet that needs to be updated", + "schema": { + "type": "string" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "parameters": [ + { + "name": "api_key", + "in": "header", + "description": "", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "additionalMetadata", + "in": "query", + "description": "Additional Metadata", + "required": false, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponse" + } + } + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "Place a new order in the store", + "operationId": "placeOrder", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "405": { + "description": "Invalid input" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions.", + "operationId": "getOrderById", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of order that needs to be fetched", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Order" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "requestBody": { + "description": "Created user object", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "Creates list of users with given input array", + "operationId": "createUsersWithListInput", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Rate-Limit": { + "description": "calls per hour allowed by the user", + "schema": { + "type": "integer", + "format": "int32" + } + }, + "X-Expires-After": { + "description": "date in UTC when token expires", + "schema": { + "type": "string", + "format": "date-time" + } + } + }, + "content": { + "application/xml": { + "schema": { + "type": "string" + } + }, + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "content": { + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Update user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Update an existent user in the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/User" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "default": { + "description": "successful operation" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "components": { + "schemas": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "petId": { + "type": "integer", + "format": "int64", + "example": 198772 + }, + "quantity": { + "type": "integer", + "format": "int32", + "example": 7 + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "example": "approved", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "order" + } + }, + "Customer": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 100000 + }, + "username": { + "type": "string", + "example": "fehguy" + }, + "address": { + "type": "array", + "xml": { + "name": "addresses", + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Address" + } + } + }, + "xml": { + "name": "customer" + } + }, + "Address": { + "type": "object", + "properties": { + "street": { + "type": "string", + "example": "437 Lytton" + }, + "city": { + "type": "string", + "example": "Palo Alto" + }, + "state": { + "type": "string", + "example": "CA" + }, + "zip": { + "type": "string", + "example": "94301" + } + }, + "xml": { + "name": "address" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "name": { + "type": "string", + "example": "Dogs" + } + }, + "xml": { + "name": "category" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "theUser" + }, + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "James" + }, + "email": { + "type": "string", + "example": "john@email.com" + }, + "password": { + "type": "string", + "example": "12345" + }, + "phone": { + "type": "string", + "example": "12345" + }, + "userStatus": { + "type": "integer", + "description": "User Status", + "format": "int32", + "example": 1 + } + }, + "xml": { + "name": "user" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "tag" + } + }, + "Pet": { + "required": [ + "name", + "photoUrls" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "name": { + "type": "string", + "example": "doggie" + }, + "category": { + "$ref": "#/components/schemas/Category" + }, + "photoUrls": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "type": "string", + "xml": { + "name": "photoUrl" + } + } + }, + "tags": { + "type": "array", + "xml": { + "wrapped": true + }, + "items": { + "$ref": "#/components/schemas/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "xml": { + "name": "##default" + } + } + }, + "requestBodies": { + "Pet": { + "description": "Pet object that needs to be added to the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "UserArray": { + "description": "List of user object", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + }, + "securitySchemes": { + "petstore_auth": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "https://petstore3.swagger.io/oauth/authorize", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + } + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + } + } +} diff --git a/profiles/.keep b/profiles/.keep new file mode 100644 index 0000000..e69de29 diff --git a/profiles/included-profiles.txt b/profiles/included-profiles.txt deleted file mode 100644 index f359d07..0000000 --- a/profiles/included-profiles.txt +++ /dev/null @@ -1,2 +0,0 @@ -ooapi -rio diff --git a/profiles/ooapi b/profiles/ooapi deleted file mode 100644 index e32465d..0000000 --- a/profiles/ooapi +++ /dev/null @@ -1,167 +0,0 @@ -{:openapi-spec "ooapi.openapi.json" - :seeds - [{:method "get" - :path "/"} - {:method "get" - :path "/academic-sessions"} - {:method "get" - :path "/buildings"} - - {:method "get" - :path "/courses"} - {:method "get" - :path "/education-specifications"} - {:method "get" - :path "/groups"} - {:method "get" - :path "/news-feeds"} - {:method "get" - :path "/organizations"} - {:method "get" - :path "/persons"} - {:method "get" - :path "/persons/me"} - {:method "get" - :path "/programs"} - {:method "get" - :path "/rooms"}] - - :rules - [;; page through items list for any kind of entity - {:match [[:request :method, "get"] - [:request :path ?path] - [:response :status 200] - [:response, :body, "pageNumber", ?pageNumber] - [:response, :body, "hasNextPage", true]] - :generates [{:method "get" - :path ?path - ;; params must be passed as strings - :query-params {"pageNumber" "{(inc ?pageNumber)}"}}]} - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "academicSessionId" ?id]] - :generates [{:method "get" - :path "/academic-sessions/{?id}"} - {:method "get" - :path "/academic-sessions/{?id}/offerings"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "buildingId" ?id]] - :generates [{:method "get" - :path "/buildings/{?id}"} - {:method "get" - :path "/buildings/{?id}/rooms"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "courseId" ?id]] - :generates [{:method "get" - :path "/courses/{?id}"} - {:method "get" - :path "/courses/{?id}/components"} - {:method "get" - :path "/courses/{?id}/offerings"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "educationSpecificationId" ?id]] - :generates [{:method "get" - :path "/education-specifications/{?id}"} - {:method "get" - :path "/education-specifications/{?id}/courses"} - {:method "get" - :path "/education-specifications/{?id}/education-specifications"} - {:method "get" - :path "/education-specifications/{?id}/programs"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "groupId" ?id]] - :generates [{:method "get" - :path "/groups/{?id}"} - {:method "get" - :path "/groups/{?id}/persons"}]} - - ;; from any kind of offering - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "offeringId" ?id]] - :generates [{:method "get" - :path "/offerings/{?id}"} - {:method "get" - :path "/offerings/{?id}/associations"} - {:method "get" - :path "/offerings/{?id}/groups"}]} - - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "organizationId" ?id]] - :generates [{:method "get" - :path "/organizations/{?id}"} - {:method "get" - :path "/organizations/{?id}/programs"} - {:method "get" - :path "/organizations/{?id}/courses"} - {:method "get" - :path "/organizations/{?id}/components"} - {:method "get" - :path "/organizations/{?id}/offerings"} - {:method "get" - :path "/organizations/{?id}/groups"} - {:method "get" - :path "/organizations/{?id}/education-specifications"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "personId" ?id]] - :generates [{:method "get" - :path "/persons/{?id}"} - {:method "get" - :path "/persons/{?id}/associations"} - {:method "get" - :path "/persons/{?id}/groups"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:path "/persons/me"] - [:response, :body, "personId" ?id]] - :generates [{:method "get" - :path "/persons/{?id}"} - {:method "get" - :path "/persons/{?id}/associations"} - {:method "get" - :path "/persons/{?id}/groups"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "programId" ?id]] - :generates [{:method "get" - :path "/programs/{?id}"} - {:method "get" - :path "/programs/{?id}/programs"} - {:method "get" - :path "/programs/{?id}/courses"} - {:method "get" - :path "/programs/{?id}/offerings"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "roomId" ?id]] - :generates [{:method "get" - :path "/rooms/{?id}"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "newsFeedId" ?id]] - :generates [{:method "get" - :path "/news-feeds/{?id}"} - {:method "get" - :path "/news-feeds/{?id}/news-items"}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "newsItemId" ?id]] - :generates [{:method "get" - :path "/news-items/{?id}"}]}]} diff --git a/profiles/ooapi.openapi.json b/profiles/ooapi.openapi.json deleted file mode 100644 index 290beeb..0000000 --- a/profiles/ooapi.openapi.json +++ /dev/null @@ -1,10050 +0,0 @@ -{ - "openapi": "3.0.3", - "info": { - "version": "5.0.0", - "title": "Open Education API", - "description": "OpenAPI (fka Swagger) specification for the Open Education API.\n\n
\n\t\n \"OOAPI\n \n
OOAPI information model that feeds OOAPI specification (click to enlage)
\n
\n\nThe model provides an overview of how the objects on which the API is specified are related. The overarching concept educations is not found in the in the end points of the API. The smaller concepts of programOffering, courseOffering and conceptOffering are all found in the offering endpoint. The different types of association can all be found in the association endpoint.\n\nThe original file for this model can be found here\n\nThe program relations object is not found as a separate endpoint but relations between programs can be found within the program endpoint by expanding that endpoint.\n\nInformation about earlier meetings and presentations can be found here\n\nInformation on the EDU-API model that was also used for this api is shown here\n", - "x-logo": { - "url": "../logo.png" - } - }, - "servers": [ - { - "url": "http://demo01.eduapi.nl/v5", - "description": "SURF demo implementation" - } - ], - "tags": [ - { - "name": "service metadata", - "description": "The service API provides additional metadata needed to make the OOAPI fit for this organization." - }, - { - "name": "academic sessions", - "description": "The academic sessions API provides information about the different time periods a program can be offered." - }, - { - "name": "associations", - "description": "The associations API provides information about the association between an offering and a person (e.g. students, lecturers, etc).\nAssociations can be posted between institutions This requires information details on the offering and the persons.\nTo allow for this information a complete person object and offering object can be part of the API.\nThe structure is explained in the following model:\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
offering
studentexternal
internalPOST /associations/external/me gets student details from .wellknown at home institution. It passes offering details (provided by external institution) to the home institution so the home institution can create a placeholder for the offering and its results. \n
externalno support needed
\nDirect update of current information: PATCH /associations/{associationId}\nThis call is currently limited to passing results and a remote state. For future use other association resource information could be passed. \nMore information on the support for student mobility can be found \nhere\n" - }, - { - "name": "buildings", - "description": "The building API provides a building that is currently used by the organization. Including all location details." - }, - { - "name": "courses", - "description": "The courses API provides a self-contained and formally structured learning experience. Aimed at providing learning outcomes to students. Usually placed in the context of a program." - }, - { - "name": "components", - "description": "The components API provides information about components being part of parent courses." - }, - { - "name": "education specifications", - "description": "The education specification API provides information on the specification of an education object.\nThis specification allows for other education objects to be derived from it.\nIt is used to aggregate education objects from a supplying institution.\nIt clusters programs to a main educationSpecification that is used in registries such as RIO.\n" - }, - { - "name": "groups", - "description": "The groups API provides information about groups that are related to organizations, persons and offerings. Groups of students that are related to an offering are typically used for rostering. The rostering application assigns students based on these groups. For example, class 1b will be assigned to the course offering on monday morning. Not all groups are related to an offering. A group of people can also be a team that is working on a task outside the OOAPI scope. These can be teams of students, but also teams of employees." - }, - { - "name": "news", - "description": "The news API provides news feeds and items regarding a specific subject." - }, - { - "name": "offerings", - "description": "The offerings API provides information about offerings which have a global timeframe, e.g. a period to which students can enroll." - }, - { - "name": "organizations", - "description": "The organizations API provides the organizations that are responsible for the execution and recognition of education." - }, - { - "name": "persons", - "description": "The persons API provides information about persons related to an organization." - }, - { - "name": "programs", - "description": "The programs API provides a coherent set of educational components, aimed at the realization of competences or objectives in the field of knowledge, insight, attitudes and skills that the person who completes the program must have." - }, - { - "name": "rooms", - "description": "The rooms API provides the part of a building where an activity can take place. Including detail information on the resources available, number of seats, etc. (Updated continuously)" - }, - { - "name": "service_model", - "x-displayName": "Service", - "description": "\n" - }, - { - "name": "education_specification_model", - "x-displayName": "EducationSpecification", - "description": "\n" - }, - { - "name": "program_model", - "x-displayName": "Program", - "description": "\n" - }, - { - "name": "course_model", - "x-displayName": "Course", - "description": "\n" - }, - { - "name": "component_model", - "x-displayName": "Component", - "description": "\n" - }, - { - "name": "program_offering_model", - "x-displayName": "ProgramOffering", - "description": "\n" - }, - { - "name": "course_offering_model", - "x-displayName": "CourseOffering", - "description": "\n" - }, - { - "name": "component_offering_model", - "x-displayName": "ComponentOffering", - "description": "\n" - }, - { - "name": "association_model", - "x-displayName": "Association", - "description": "\n" - }, - { - "name": "person_model", - "x-displayName": "Person", - "description": "\n" - }, - { - "name": "group_model", - "x-displayName": "Group", - "description": "\n" - }, - { - "name": "academic_session_model", - "x-displayName": "AcademicSession", - "description": "\n" - }, - { - "name": "organization_model", - "x-displayName": "Organization", - "description": "\n" - }, - { - "name": "building_model", - "x-displayName": "Building", - "description": "\n" - }, - { - "name": "room_model", - "x-displayName": "Room", - "description": "\n" - }, - { - "name": "news_feed_model", - "x-displayName": "NewsFeed", - "description": "\n" - }, - { - "name": "news_item_model", - "x-displayName": "NewsItem", - "description": "\n" - } - ], - "x-tagGroups": [ - { - "name": "Requests and respones", - "tags": [ - "service metadata", - "academic sessions", - "associations", - "buildings", - "courses", - "components", - "education specifications", - "groups", - "news", - "offerings", - "organizations", - "persons", - "programs", - "rooms" - ] - }, - { - "name": "Models", - "tags": [ - "service_model", - "academic_session_model", - "association_model", - "building_model", - "component_model", - "component_offering_model", - "course_model", - "course_offering_model", - "education_specification_model", - "group_model", - "news_feed_model", - "news_item_model", - "organization_model", - "person_model", - "program_model", - "program_offering_model", - "room_model" - ] - } - ], - "components": { - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "Bearer" - }, - "openId": { - "type": "openIdConnect", - "openIdConnectUrl": "https://example.nl/.well-known/openid-configuration" - } - }, - "schemas": { - "Consumer": { - "type": "object", - "description": "Object for communicating data to a specific consumer (destination). This object has no relationship with the `consumer` query parameter.", - "required": [ - "consumerKey" - ], - "properties": { - "consumerKey": { - "description": "The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://open-education-api.github.io/specification/#/consumers) for more information.", - "type": "string" - } - }, - "additionalProperties": true - }, - "Ext": { - "type": "object", - "description": "Object for additional non-standard attributes" - }, - "Service": { - "type": "object", - "description": "A metadataset providing details on the provider of this OOAPI implementation", - "required": [ - "contactEmail", - "specification", - "documentation" - ], - "properties": { - "contactEmail": { - "type": "string", - "description": "Contact e-mail address of the service owner", - "format": "email", - "maxLength": 256, - "example": "admin@universiteitvanharderwijk.nl" - }, - "specification": { - "type": "string", - "description": "URL of the API specification (YAML or JSON, compliant with [Open API Specification v3](https://github.com/OAI/OpenAPI-Specification/))", - "format": "uri", - "maxLength": 2048, - "example": "https://rawgit.com/open-education-api/specification/v3/docs.html#tag/course-offerings/paths/~1course-offerings/get" - }, - "documentation": { - "type": "string", - "description": "URL of the API documentation, including general terms and privacy statement", - "format": "uri", - "maxLength": 2048, - "example": "https://open-education-api.github.io/specification/v4/docs.html" - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Problem": { - "type": "object", - "description": "A system message including the error code and an explanation", - "required": [ - "status", - "title" - ], - "properties": { - "status": { - "type": "string", - "description": "The HTTP status code", - "example": "404" - }, - "title": { - "type": "string", - "description": "A short, human-readable summary of the problem type", - "example": "Resource not found" - }, - "detail": { - "type": "string", - "description": "A human-readable explanation specific to this occurrence of the problem" - } - } - }, - "personAffiliations": { - "type": "array", - "description": "The affiliations of this person, the relations a person has with the organization providing this endpoint\n- student: student\n- employee: medewerker\n- guest: gast\n", - "items": { - "type": "string", - "enum": [ - "student", - "employee", - "guest" - ], - "example": "student" - } - }, - "Pagination": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page", - "example": 10 - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number", - "example": 1, - "minimum": 1 - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page", - "example": false - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page", - "example": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages", - "example": 8 - } - } - }, - "PersonId": { - "type": "object", - "properties": { - "personId": { - "type": "string", - "description": "Unique id of this person", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - } - }, - "required": [ - "personId" - ] - }, - "codeType": { - "type": "string", - "description": "The code/identifier type. \n\nThis is an *extensible enumeration*. Use `x-` to prefix custom values\n\nThe predefined values are:\n - `brin`: The registration number for a Dutch educational institution that is issued by the Dutch Ministry of Education, Culture and Science\n - `crohoCreboCode`: programs with a CREBO and CROHO number are accredited by the Dutch Ministry of Education, Culture and Science (OCW)\n - `programCode`: Identifier for the program (collection of courses)\n - `componentCode`: The code for a component (part of a course)\n - `offeringCode`: The code to identify a specific offering (program, course or component offering)\n - `organizationId`: The identifier for the organization\n - `buildingId`: The number or code to identify a building\n - `bagId`: The identification of a building as it is known in the Dutch Building Administration (BAG)\n - `roomCode`: The code for a room\n - `systemId`: Identifier assigned to an entity in context of a specific system\n - `productId`: Identifier assigned to a specific product\n - `nationalIdentityNumber`: Identifier assigned by the governement of the person. e.g. a social security number in the USA\n - `studentNumber`: Identifier for the student\n - `studielinkNumber`: Identifier for the person as determined by Studielink\n - `esi`: European Student Identifier\n - `userName`: The name of a user\n - `accountId`: Identifier assigned to a specific account\n - `emailAdress`: An email address\n - `groupCode`: The identifier for a group (of persons)\n - `isbn`: International Standard Book Number that serve as product identifiers for Books\n - `issn`: International Standard Book Number that serve as product identifiers for periodicals\n - `orcId`: Open Researcher and Contributor ID\n - `uuid`: A universally unique identifier\n - `schacHome`: Home organization using the domain name of the organization\n - `identifier`: Generic Identifier\n", - "x-ooapi-extensible-enum": [ - "brin", - "crohoCreboCode", - "programCode", - "componentCode", - "offeringCode", - "organizationId", - "buildingId", - "bagId", - "roomCode", - "systemId", - "productId", - "nationalIdentityNumber", - "studentNumber", - "studielinkNumber", - "esi", - "userName", - "accountId", - "emailAdress", - "groupCode", - "isbn", - "issn", - "orcId", - "uuid", - "schacHome", - "identifier" - ], - "example": "identifier" - }, - "IdentifierEntry": { - "type": "object", - "properties": { - "codeType": { - "$ref": "#/components/schemas/codeType" - }, - "code": { - "description": "Human readable value for the code/identifier", - "type": "string" - } - }, - "required": [ - "codeType", - "code" - ], - "additionalProperties": false, - "example": { - "codeType": "identifier", - "code": "1234qwe12" - } - }, - "gender": { - "type": "string", - "description": "The gender of this person", - "enum": [ - "M", - "F", - "U", - "X" - ], - "example": "F" - }, - "addressType": { - "type": "string", - "description": "Address type\n- postal: post\n- visit: bezoek\n- deliveries: bezorg\n- billing: factuur\n- teaching: the address where education takes place\n", - "enum": [ - "postal", - "visit", - "deliveries", - "billing", - "teaching" - ] - }, - "LanguageTypedString": { - "type": "object", - "description": "A String with an associated language code.", - "properties": { - "language": { - "description": "The language used in the described entity. A string formatted according to RFC3066.", - "type": "string", - "pattern": "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$" - }, - "value": { - "description": "String to describe the entity.", - "type": "string" - } - }, - "example": { - "language": "en-GB", - "value": "program that is a place holder for all courses that are made available for student mobility" - } - }, - "Address": { - "type": "object", - "description": "The full street address", - "required": [ - "addressType" - ], - "properties": { - "addressType": { - "$ref": "#/components/schemas/addressType" - }, - "street": { - "type": "string", - "description": "The street name", - "example": "Moreelsepark" - }, - "streetNumber": { - "type": "string", - "description": "The street number", - "example": "48" - }, - "additional": { - "type": "array", - "description": "Further details like building name, suite, apartment number, etc.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "On the other side of the road" - } - ] - }, - "postalCode": { - "type": "string", - "description": "Postal code", - "example": "3511 EP" - }, - "city": { - "type": "string", - "description": "name of the city / locality", - "example": "Utrecht" - }, - "countryCode": { - "type": "string", - "description": "the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)", - "example": "NL" - }, - "geolocation": { - "type": "object", - "description": "Geolocation of the entrance of this address (WGS84 coordinate reference system)", - "required": [ - "latitude", - "longitude" - ], - "properties": { - "latitude": { - "type": "number", - "format": "double", - "example": 52.089123 - }, - "longitude": { - "type": "number", - "format": "double", - "example": 5.113337 - } - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "ICERelationType": { - "type": "string", - "description": "Type of relation between person and In Case of Emergency contact", - "enum": [ - "partner", - "parent", - "other" - ], - "example": "partner" - }, - "PersonProperties": { - "type": "object", - "description": "A person that has a relationship with this institution", - "required": [ - "givenName", - "surname", - "displayName", - "affiliations", - "mail", - "primaryCode", - "activeEnrollment" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the person. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "studentNumber", - "code": 0 - }, - "readOnly": true - }, - "givenName": { - "type": "string", - "description": "The first name of this person", - "maxLength": 256, - "example": "Maartje" - }, - "surnamePrefix": { - "type": "string", - "description": "The prefix of the family name of this person", - "example": "van" - }, - "surname": { - "type": "string", - "description": "The family name of this person", - "maxLength": 256, - "example": "Damme" - }, - "displayName": { - "type": "string", - "description": "The name of this person which will be displayed", - "maxLength": 256, - "example": "Maartje van Damme" - }, - "initials": { - "type": "string", - "description": "The initials of this person", - "example": "MCW" - }, - "activeEnrollment": { - "type": "boolean", - "description": "Whether this person has an active enrollment.", - "example": false - }, - "dateOfBirth": { - "type": "string", - "description": "The date of birth of this person, RFC3339 (full-date)", - "format": "date", - "example": "2003-09-30" - }, - "cityOfBirth": { - "type": "string", - "description": "The city of birth of this person", - "example": "Utrecht" - }, - "countryOfBirth": { - "type": "string", - "description": "The country of birth of this person the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)", - "example": "NL" - }, - "nationality": { - "type": "string", - "description": "The nationality of this person the nationality according to https://gist.github.com/zspine/2365808", - "example": "Dutch" - }, - "dateOfNationality": { - "type": "string", - "description": "The date of nationality of this person, RFC3339 (full-date)", - "format": "date", - "example": "2003-09-30" - }, - "affiliations": { - "$ref": "#/components/schemas/personAffiliations" - }, - "mail": { - "type": "string", - "description": "The primary e-mailaddress of this person", - "format": "email", - "maxLength": 256, - "example": "vandamme.mcw@universiteitvanharderwijk.nl" - }, - "secondaryMail": { - "type": "string", - "description": "The secondary e-mailaddress of this person", - "format": "email", - "maxLength": 256, - "example": "poekie@xyz.nl" - }, - "telephoneNumber": { - "type": "string", - "description": "The telephone number of this person", - "maxLength": 256, - "example": "+31 123 456 789" - }, - "mobileNumber": { - "type": "string", - "description": "The mobile number of this person", - "maxLength": 256, - "example": "+31 612 345 678" - }, - "photoSocial": { - "type": "string", - "description": "The url of the informal picture of this person", - "format": "uri", - "maxLength": 2048, - "example": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Placeholder_female_superhero_c.png/203px-Placeholder_female_superhero_c.png" - }, - "photoOfficial": { - "type": "string", - "description": "The url of the official picture of this person", - "format": "uri", - "maxLength": 2048, - "example": "https://upload.wikimedia.org/wikipedia/commons/6/66/Johannes_Vermeer_%281632-1675%29_-_The_Girl_With_The_Pearl_Earring_%281665%29.jpg" - }, - "gender": { - "$ref": "#/components/schemas/gender" - }, - "titlePrefix": { - "type": "string", - "description": "A title prefix to be used for this person", - "example": "drs" - }, - "titleSuffix": { - "type": "string", - "description": "A title suffix to be used for this person", - "example": "BSc" - }, - "office": { - "type": "string", - "description": "The name of the office where this person is located" - }, - "address": { - "$ref": "#/components/schemas/Address" - }, - "ICEName": { - "type": "string", - "description": "Full name of In Case of Emergency contact", - "maxLength": 256, - "example": "Janne" - }, - "ICEPhoneNumber": { - "type": "string", - "description": "Phone number of In Case of Emergency contact", - "maxLength": 256, - "example": "+31 623 456 789" - }, - "ICERelation": { - "$ref": "#/components/schemas/ICERelationType" - }, - "languageOfChoice": { - "type": "array", - "description": "The language(s) of choice for this person, RFC3066", - "items": { - "type": "string", - "example": "nl-NL" - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "nationalIdentityNumber", - "code": "00000" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Person": { - "allOf": [ - { - "$ref": "#/components/schemas/PersonId" - }, - { - "$ref": "#/components/schemas/PersonProperties" - } - ] - }, - "PostResponse": { - "type": "object", - "description": "A system message as a response to a POST message", - "required": [ - "message" - ], - "properties": { - "message": { - "description": "information displayed to user", - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Your enrollment was partly succesful, you have been placed on the waitinglist" - } - ] - }, - "redirect": { - "description": "URL where additional information can be found e.g. by use of deeplink", - "type": "string", - "format": "uri" - } - } - }, - "associationRole": { - "type": "string", - "description": "The role of this person associated with the offering\n - student: student\n - lecturer: docent\n - teaching assistant: studentassistent\n - coordinator: coördinator\n - guest: gast\n", - "enum": [ - "student", - "lecturer", - "teaching assistant", - "coordinator", - "guest" - ], - "example": "student" - }, - "associationState": { - "type": "string", - "description": "The state of this association", - "enum": [ - "pending", - "canceled", - "denied", - "associated", - "queued" - ], - "example": "associated" - }, - "resultState": { - "type": "string", - "description": "The state of this result", - "enum": [ - "in progress", - "postponed", - "completed", - "queued" - ], - "example": "completed" - }, - "AssociationId": { - "type": "object", - "properties": { - "associationId": { - "type": "string", - "description": "Unique id of this association", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - } - }, - "required": [ - "associationId" - ] - }, - "remoteAssociationState": { - "type": "string", - "description": "The state of this association for the institution performing the request.", - "enum": [ - "pending", - "canceled", - "denied", - "associated", - "queued" - ], - "example": "associated" - }, - "AssociationProperties": { - "type": "object", - "description": "A relationship between a person object and an offering", - "required": [ - "associationType", - "role", - "state" - ], - "properties": { - "associationType": { - "type": "string", - "description": "The type of this association", - "enum": [ - "programOfferingAssociation", - "courseOfferingAssociation", - "componentOfferingAssociation" - ], - "example": "componentOfferingAssociation", - "readOnly": true - }, - "role": { - "$ref": "#/components/schemas/associationRole" - }, - "state": { - "$ref": "#/components/schemas/associationState", - "readOnly": true - }, - "remoteState": { - "$ref": "#/components/schemas/remoteAssociationState", - "writeOnly": true - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Association": { - "allOf": [ - { - "$ref": "#/components/schemas/AssociationId" - }, - { - "$ref": "#/components/schemas/AssociationProperties" - } - ] - }, - "passState": { - "type": "string", - "description": "The state of this result", - "enum": [ - "unknown", - "passed", - "failed" - ], - "example": "passed" - }, - "Result": { - "type": "object", - "description": "A result as part of an association", - "required": [ - "state", - "resultDate" - ], - "properties": { - "state": { - "$ref": "#/components/schemas/resultState" - }, - "pass": { - "$ref": "#/components/schemas/passState" - }, - "comment": { - "type": "string", - "description": "The comment on this result" - }, - "score": { - "type": "string", - "description": "The score of this program/course/component association (based on resultValueType in offering)", - "example": "9" - }, - "resultDate": { - "type": "string", - "description": "The date this result has been published, RFC3339 (full-date)", - "format": "date", - "example": "2020-09-28" - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "StudyLoadDescriptor": { - "type": "object", - "description": "The amount of effort to complete this education in the specified unit.", - "properties": { - "studyLoadUnit": { - "description": "The unit in which the studyload is specfied\n- contacttime: CONTACTUUR\tamount of time spent in classes\n- ects: ECTS_PUNT\tEuropean Credit Transfer System\n- sbu: SBU\tstudentloadhours\n- sp: STUDIEPUNT studentpoints\n- hour: UUR\thours\n", - "type": "string", - "enum": [ - "contacttime", - "ects", - "sbu", - "sp", - "hour" - ], - "example": "ects" - }, - "value": { - "description": "The amount of load depicted in numbers", - "type": "number", - "example": 3 - } - }, - "example": { - "studyLoadUnit": "ects", - "value": 3 - } - }, - "ProgramResult": { - "allOf": [ - { - "$ref": "#/components/schemas/Result" - }, - { - "type": "object", - "required": [ - "studyLoad" - ], - "properties": { - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - } - } - } - ] - }, - "ProgramOfferingAssociation": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/ProgramResult" - } - } - } - ] - }, - "OfferingId": { - "type": "object", - "description": "ID of Either a program, course or component offering which descrbes the program, course or offering in time", - "required": [ - "offeringId" - ], - "properties": { - "offeringId": { - "type": "string", - "description": "Unique id of this offering", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-134564174000", - "readOnly": true - } - } - }, - "academicSessionType": { - "type": "string", - "description": "The type of this Academic Session This is an *extensible enumeration*.\n- academic year: academic year\n- semester: semester, typically there are two semesters per academic year\n- trimester: trimester, typically there are three semesters per academic year\n- quarter: quarter, typically there are four quarters per academic year\n- testing period: a period in which tests take place\n- period: any other period in an academic year\n\nImplementations are allowed to add additional values to those above, as long as they do not overlap in definition to existing values.\n", - "example": "semester", - "x-ooapi-extensible-enum": [ - "academic year", - "semester", - "trimester", - "quarter", - "testing period", - "period" - ] - }, - "Identifier": { - "type": "string", - "description": "An identifier of another resource.", - "format": "uuid" - }, - "AcademicSession": { - "type": "object", - "description": "A named period of time that can be used to communicate the various schedules and time periods an institution recognizes and uses to organize their education. AcademicSessions can be nested.\nOfferings MAY be be linked to a specific AcademicSession to indicate that the specified Offering takes place during the AcademicSession, however this is not mandatory.\n", - "required": [ - "academicSessionId", - "name", - "startDate", - "endDate" - ], - "properties": { - "academicSessionId": { - "type": "string", - "description": "Unique id for this academic session", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - }, - "academicSessionType": { - "$ref": "#/components/schemas/academicSessionType" - }, - "primaryCode": { - "description": "The primary human readable identifier for this academic session. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "identifier", - "code": "2012-Q1" - } - }, - "name": { - "type": "array", - "description": "The name of this academic session", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Fall semester 2020" - } - ] - }, - "startDate": { - "type": "string", - "description": "The day on which this academic session starts, RFC3339 (full-date)", - "format": "date", - "example": "2020-08-17" - }, - "endDate": { - "type": "string", - "description": "The day on which this academic session ends, RFC3339 (full-date)", - "format": "date", - "example": "2020-12-18" - }, - "parent": { - "description": "The parent Academicsession of this session (e.g. fall semester 20xx where the current session is a week 40). This object is [`expandable`](#tag/academic_sessions_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - }, - "children": { - "type": "array", - "description": "The list of Academicsession children of this Session (e.g. all academic sessions in fall semester 20xx). This object is [`expandable`](#tag/academic_sessions_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - } - }, - "year": { - "description": "The top level year of this session (e.g. 20xx where the current session is a week 40 of a semester). This object is [`expandable`](#tag/academic_sessions_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "modesOfDelivery": { - "type": "array", - "description": "The mode of delivery of the component (ECTS-mode of delivery)\n- distance-learning: afstandsleren\n- on campus: op de campus\n- online: online\n- hybrid: hybride\n- situated: op locatie\n", - "items": { - "type": "string", - "enum": [ - "distance-learning", - "on campus", - "online", - "hybrid", - "situated" - ], - "example": "situated" - } - }, - "resultValueType": { - "type": "string", - "description": "The result value type for this offering", - "enum": [ - "pass-or-fail", - "US letter", - "UK letter", - "0-100", - "1-10" - ], - "example": "1-10" - }, - "OfferingProperties": { - "type": "object", - "description": "Either a program, course or component offering which descrbes the program, course or offering in time", - "required": [ - "primaryCode", - "offeringType", - "name", - "description", - "teachingLanguage", - "resultExpected" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for this offering. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "offeringCode", - "code": "INFOMQNM-20FS" - }, - "readOnly": true - }, - "offeringType": { - "type": "string", - "description": "The type of this offering", - "enum": [ - "program", - "course", - "component" - ], - "example": "component" - }, - "academicSession": { - "$ref": "#/components/schemas/AcademicSession" - }, - "name": { - "type": "array", - "description": "The name of this offering", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Final written test for INFOMQNM for fall semseter 2020" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation or internal code used to identify this offering", - "maxLength": 256, - "example": "Test-INFOMQNM-20FS" - }, - "description": { - "type": "array", - "description": "The description of this offering.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "'Prove in writing knowledge of research methods, including:\nAcquire knowledge of HCI research paradigms\nAble to design suitable research studies (e.g., choose between within and between subject designs)\nDefine/apply/design metrics and scales\nDefine/produce materials (e.g., stimuli and questionnaires)\nDefine protocols for research studies\nUnderstands and take in account concepts of reliability and validity\nAnalyze and improve methods and analysis of published scientific articles\nAble to deliver scientific reports\nProve in writing knowledge of ­­­statistics, including:\nHandle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates)\nData preparation (e.g., coding and feature selection)\nReason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors)\nSelect an appropriate sampling method (e.g., stratified)\nPerform parametric tests (e.g., repeated measures (M)ANOVA)\nPerform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n" - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this offering is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "maxNumberStudents": { - "type": "number", - "description": "The maximum number of students allowed to enroll for this offering", - "format": "int32", - "minimum": 0, - "example": 200 - }, - "enrolledNumberStudents": { - "type": "number", - "description": "The number of students that have already enrolled for this offering", - "format": "int32", - "minimum": 0, - "example": 150 - }, - "pendingNumberStudents": { - "type": "number", - "description": "The number of students that have a pending enrollment request for this offering", - "format": "int32", - "minimum": 0, - "example": 50 - }, - "minNumberStudents": { - "type": "number", - "description": "The minimum number of students needed for this offering to proceed", - "format": "int32", - "minimum": 0, - "example": 15 - }, - "resultExpected": { - "type": "boolean", - "description": "resultExpected, previously knwon as isLineItem is used so the specific instance of the object is identified as being an element that CAN contain “grade” information.\nOfferings do not always have to result in a grade or an other type of result. \nIf there is a result expected from a programOffering/courseOffering/componentOffering the is resultExpected field should parse true\n", - "example": true - }, - "resultValueType": { - "$ref": "#/components/schemas/resultValueType" - }, - "link": { - "type": "string", - "description": "URL of this offering's webpage.", - "format": "uri", - "maxLength": 2048, - "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "explanationRequiredPermission": "Toestemming is vereist omdat we daarom vragen.", - "requiredPermissionRegistration": "yes", - "registrationStatus": "open" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Offering": { - "allOf": [ - { - "$ref": "#/components/schemas/OfferingId" - }, - { - "$ref": "#/components/schemas/OfferingProperties" - } - ] - }, - "costType": { - "type": "string", - "description": "The type of the cost. This is an *extensible enumeration*.\n\nThe following values have been defined in the specification:\n - `STAP eligible`: the costs that a student can get STAP subsidy for\n - `total costs`: the total costs that a student is to pay to follow this offering\n\nImplementations are allowed to add additional values to those above, as long as they do not overlap in definition to existing values.\n", - "example": "total costs", - "x-ooapi-extensible-enum": [ - "STAP eligible", - "total costs" - ] - }, - "Cost": { - "type": "object", - "required": [ - "costType" - ], - "properties": { - "costType": { - "$ref": "#/components/schemas/costType" - }, - "amount": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The total amount of the cost as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "340.84" - }, - "vatAmount": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The part of the cost that is VAT, as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "40" - }, - "amountWithoutVat": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The part of the cost that is non-VAT. as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "300.84" - }, - "currency": { - "type": "string", - "description": "The currency this cost is in. Should correspond to one of the currency codes from ISO 4217.", - "example": "EUR" - }, - "displayAmount": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "An array of optional pre-formatted strings in different locales. Clients can choose to use this string instead of rendering their own based on the current locale of the user.", - "example": [ - { - "language": "nl-NL", - "value": "€380,84" - }, - { - "language": "en-US", - "value": "$401.17" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - }, - "additionalProperties": false - }, - "ProgramId": { - "type": "object", - "description": "A collection of courses that lead to a certifiable learning outcome", - "required": [ - "programId" - ], - "properties": { - "programId": { - "type": "string", - "description": "Unique id for this program", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - } - } - }, - "programType": { - "type": "string", - "description": "The type of this program\n- program: opleiding\n- minor: minor\n- honours: honours\n- specialization: specialisatie\n- track: track\n", - "enum": [ - "program", - "minor", - "honours", - "specialization", - "track" - ], - "example": "program" - }, - "qualificationAwarded": { - "type": "string", - "description": "Type of qualificaton that can be obtained on finishing the program", - "enum": [ - "AD", - "BA", - "BSc", - "LLB", - "MA", - "MSc", - "LLM", - "Phd", - "None" - ], - "example": "None" - }, - "modeOfStudy": { - "type": "string", - "description": "Indicates whether the education is full-time, part-time, dual or self-paced.\n - full-time: fulltime\n - part-time: parttime\n - dual training: duaal\n - self-paced: eigen tempo\n", - "enum": [ - "full-time", - "part-time", - "dual training", - "self-paced" - ] - }, - "levelOfQualification": { - "type": "string", - "description": "Level of qualification according to the Dutch National Qualification Framework and the European Qualifications Framework, see [this overview](https://nlqf.nl/images/downloads/English2018/Schematic_overview_NLQF_2020.pdf) for more information.", - "enum": [ - "1", - "2", - "3", - "4", - "4+", - "5", - "6", - "7", - "8" - ], - "example": "6" - }, - "level": { - "type": "string", - "description": "The level of this course (ECTS-year of study if applicable)\n- secondary vocational education: mbo\n- secondary vocational education 1: mbo 1, corresponds to levelOfQualification 1\n- secondary vocational education 2: mbo 2, corresponds to levelOfQualification 2\n- secondary vocational education 3: mbo 3, corresponds to levelOfQualification 3\n- secondary vocational education 4: mbo 4, corresponds to levelOfQualification 4\n- associate degree: associate degree, corresponds to levelOfQualification 5\n- bachelor: bachelor, corresponds to levelOfQualification 6\n- master: master, corresponds to levelOfQualification 7\n- doctoral: doctoraal, corresponds to levelOfQualification 8\n- undefined: onbepaald\n- undivided: ongedeeld\n- nt2-1: NT2 niveau 1\n- nt2-2: NT2 niveau 2\n", - "enum": [ - "secondary vocational education", - "secondary vocational education 1", - "secondary vocational education 2", - "secondary vocational education 3", - "secondary vocational education 4", - "associate degree", - "bachelor", - "master", - "doctoral", - "undefined", - "undivided", - "nt2-1", - "nt2-2" - ], - "example": "master" - }, - "sector": { - "type": "string", - "description": "The sector for this program\n- secondary vocational education: middelbaar beroepsonderwijs\n- higher professional education: hoger beroepsonderwijs\n- university education: universitair onderwijs\n", - "enum": [ - "secondary vocational education", - "higher professional education", - "university education" - ], - "example": "university education" - }, - "EducationSpecificationId": { - "type": "object", - "properties": { - "educationSpecificationId": { - "type": "string", - "description": "Unique id for this education specification", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - } - }, - "required": [ - "educationSpecificationId" - ] - }, - "educationSpecificationType": { - "type": "string", - "description": "The type of education specification\n - program: HOOPLEIDING\n - privateProgram: PARTICULIEREOPLEIDING\n - programCluster: HOONDERWIJSEENHEDENCLUSTER\n - course: HOONDERWIJSEENHEID\n", - "enum": [ - "program", - "privateProgram", - "cluster", - "course" - ], - "example": "program" - }, - "formalDocument": { - "type": "string", - "description": "The type of formal document obtained after completion of this education\n - diploma: DIPLOMA\n - certificate: CERTIFICAAT\n - no official document: GEEN OFFICIEEL DOCUMENT\n - testimonial: GETUIGSCHRIFT\n - school advice: SCHOOLADVIES\n", - "enum": [ - "diploma", - "certificate", - "no official document", - "testimonial", - "school advice" - ], - "example": "diploma" - }, - "EducationSpecification": { - "allOf": [ - { - "$ref": "#/components/schemas/EducationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecificationProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this EducationSpecification is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this EducationSpecification ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "organizationType": { - "type": "string", - "description": "The type of this organization. Each OOAPI endpoint should have a single organization with type `root`, describing the root organization.\n- root: the root of this organization, representing the Educational Institution itself\n- institute: instituut\n- department: departement\n- faculty: faculteit\n- branch: vestiging\n- academy: academie\n- school: school\n", - "enum": [ - "root", - "institute", - "department", - "faculty", - "branch", - "academy", - "school" - ], - "example": "root" - }, - "Organization": { - "type": "object", - "description": "A description of a group of people working together to achieve a goal", - "required": [ - "organizationId", - "organizationType", - "name", - "shortName", - "primaryCode" - ], - "properties": { - "organizationId": { - "type": "string", - "description": "Unique id of this organization", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-123514174000", - "readOnly": true - }, - "primaryCode": { - "description": "The primary human readable identifier for the organization. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "orgId", - "code": "Org01-Root" - }, - "readOnly": true - }, - "organizationType": { - "$ref": "#/components/schemas/organizationType" - }, - "name": { - "type": "array", - "description": "The name of the organization", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "nl-NL", - "value": "Coöperatie SURF U.A." - } - ] - }, - "shortName": { - "type": "string", - "description": "Short name of the organization", - "maxLength": 256, - "example": "SURF" - }, - "description": { - "type": "array", - "description": "Any general description of the organization should clearly mention the type of higher education organization, especially in the case of a binary system. In Dutch; universiteit (university) or hogeschool (university of applied sciences).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "nl-NL", - "value": "SURF is een coöperatieve vereniging van Nederlandse onderwijs- en onderzoeksinstellingen waarin de leden hun krachten bundelen. De leden zijn eigenaar van SURF." - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses of this organization", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "link": { - "type": "string", - "description": "URL of the organization's website", - "format": "uri", - "maxLength": 2048, - "example": "https://surf.nl" - }, - "logo": { - "type": "string", - "description": "Logo of this organization", - "format": "uri", - "maxLength": 2048, - "example": "https://www.surf.nl/themes/surf/logo.svg" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "brin", - "code": "00AA" - }, - { - "codeType": "kvk", - "code": "12345678" - } - ] - }, - "parent": { - "description": "The organizational unit which is the parent of this organization. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "children": { - "type": "array", - "description": "All the organizational units for which this organization is the parent. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "EducationSpecificationProperties": { - "type": "object", - "description": "The specification of an education object. This specification allows for other education objects to be derived from it.\nIt is used to aggregate education objects from a supplying institution.\nIt clusters programs to a main educationSpecification that is used in registries such as RIO. \n", - "required": [ - "primaryCode", - "educationSpecificationType", - "name" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the entity. \nThis will often take the form of a human readable code as defined by the institution or region\n", - "$ref": "#/components/schemas/IdentifierEntry" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "crohoCreboCode", - "code": "1234123" - } - ] - }, - "educationSpecificationType": { - "$ref": "#/components/schemas/educationSpecificationType" - }, - "name": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The name of this education specification", - "example": [ - { - "language": "en-GB", - "value": "Bachelor Chemical technology" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of this program", - "maxLength": 256, - "example": "B Scheikundige Technologie" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The description of this program. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation.", - "example": [ - { - "language": "en-GB", - "value": "program that is a place holder for all courses that are made available for student mobility" - } - ] - }, - "formalDocument": { - "$ref": "#/components/schemas/formalDocument" - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "sector": { - "$ref": "#/components/schemas/sector" - }, - "levelOfQualification": { - "$ref": "#/components/schemas/levelOfQualification" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "learningOutcomes": { - "type": "array", - "description": "Statements that describe the knowledge or skills students should acquire by the end of a particular course or program (ECTS-learningoutcome).", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of Chemical technology, including: Acquire knowledge of research paradigms." - } - ] - } - }, - "link": { - "type": "string", - "description": "URL of the program's website", - "format": "uri", - "maxLength": 2048, - "example": "https://bijvak.nl" - }, - "parent": { - "description": "The educationSpecification that is the parent of this educationSpecification if it exists. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "children": { - "type": "array", - "description": "The EducationSpecifications that have this EducationSpecification as their parent. [`expandable`](#tag/education_specification_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - } - }, - "organization": { - "description": "The organization that manages this group. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationSpecificationSubType": "variant", - "category": [ - "business_and_project_support", - "economy" - ] - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Program": { - "allOf": [ - { - "$ref": "#/components/schemas/ProgramId" - }, - { - "$ref": "#/components/schemas/ProgramProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this program is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this program ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "ProgramProperties": { - "type": "object", - "description": "A collection of courses that lead to a certifiable learning outcome", - "required": [ - "programType", - "name", - "abbreviation", - "description", - "primaryCode", - "teachingLanguage" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the program. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "programCode", - "code": "BIO" - }, - "readOnly": true - }, - "programType": { - "$ref": "#/components/schemas/programType" - }, - "name": { - "description": "The name of this program", - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Biology" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of this program", - "maxLength": 256, - "example": "BIO" - }, - "description": { - "type": "array", - "description": "The description of this program", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "The study of life" - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this program is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "qualificationAwarded": { - "$ref": "#/components/schemas/qualificationAwarded" - }, - "modeOfStudy": { - "$ref": "#/components/schemas/modeOfStudy" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "duration": { - "type": "string", - "description": "The duration of this program. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.", - "pattern": "^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)([DW]))?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$", - "example": "P1DT30H4S" - }, - "firstStartDate": { - "type": "string", - "description": "The date when participants can follow this program for the first time.", - "format": "date" - }, - "levelOfQualification": { - "$ref": "#/components/schemas/levelOfQualification" - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "sector": { - "$ref": "#/components/schemas/sector" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "enrollment": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The extra information that is provided for enrollment", - "example": [ - { - "language": "en-GB", - "value": "enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation." - } - ] - }, - "resources": { - "type": "array", - "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)", - "items": { - "type": "string" - }, - "example": [ - "book to be announced", - "on-line resource x" - ] - }, - "learningOutcomes": { - "type": "array", - "description": "List of learning outcomes at program level. It is advisable to limit the number of learning outcomes to approximately 20. It is also advisable to make sure that the program learning outcomes in the course catalogue correspond with those on the Diploma Supplement.", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms." - } - ] - } - }, - "assessment": { - "type": "array", - "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Exam on campus" - } - ] - }, - "admissionRequirements": { - "type": "array", - "description": "This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students.", - "example": [ - { - "language": "en-GB", - "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance" - } - ], - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "qualificationRequirements": { - "type": "array", - "description": "Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "link": { - "type": "string", - "description": "URL of the program's website", - "format": "uri", - "maxLength": 2048, - "example": "https://bijvak.nl" - }, - "educationSpecification": { - "description": "The educationSpecification of which this program is a more concrete implementation. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "crohoCreboCode", - "code": "59312" - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses for this program", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "parent": { - "description": "Parent program of which the current program is a child. This object is [`expandable`](#tag/program_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Expanded Program" - } - ] - }, - "children": { - "type": "array", - "description": "Programs which are a part of this program (e.g specializations). This object is [`expandable`](#tag/program_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Expanded Program" - } - ] - } - }, - "coordinators": { - "description": "The person(s) responsible for this program. This object is [`expandable`](#tag/person_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "personId" - }, - { - "$ref": "#/components/schemas/Person", - "title": "Person object" - } - ] - } - }, - "organization": { - "description": "The organization providing this program. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationOffererCode": "122A112", - "educationLocationCode": "123X122", - "consentParticipationSTAP": "permission_granted", - "jointPartnerCodes": [ - "122A113" - ], - "foreignPartners": [ - "Harvard University" - ], - "deficiency": "deficiencies", - "requirementsActivities": "requirements", - "propaedeuticPhase": "no_propaedeutic_phase", - "studyChoiceCheck": "no_study_choice_check", - "acceleratedRoute": "accelerated_route" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "ProgramOffering": { - "allOf": [ - { - "$ref": "#/components/schemas/Offering" - }, - { - "type": "object", - "required": [ - "modeOfStudy", - "startDate", - "endDate" - ], - "properties": { - "startDate": { - "type": "string", - "description": "The moment on which this offering starts, RFC3339 (full-date)", - "format": "date", - "example": "2019-08-21" - }, - "endDate": { - "type": "string", - "description": "The moment on which this offering ends, RFC3339 (full-date)", - "format": "date", - "example": "2023-06-15" - }, - "enrollStartDate": { - "type": "string", - "description": "The first day on which a student can enroll for this program.", - "format": "date", - "example": "2019-05-01" - }, - "enrollEndDate": { - "type": "string", - "description": "The last day on which a student can enroll for this program.", - "format": "date", - "example": "2019-08-01" - }, - "flexibleEntryPeriodStart": { - "type": "string", - "description": "If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`.", - "format": "date" - }, - "flexibleEntryPeriodEnd": { - "type": "string", - "description": "If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`.", - "format": "date" - }, - "addresses": { - "type": "array", - "description": "Addresses for this offering", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "priceInformation": { - "type": "array", - "description": "Price information for this offering.", - "items": { - "$ref": "#/components/schemas/Cost" - }, - "minItems": 1 - }, - "program": { - "description": "The Program that is offered in this programoffering. [`expandable`](#tag/program_model)\nBy default only the `programId` (a string) is returned. If the client requested an expansion of `program` the full program object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Program object" - } - ] - }, - "organization": { - "description": "The organization that manages this programeoffering. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "academicSession": { - "description": "The academicsession during which this programoffering takes place. [`expandable`](#tag/academic_session_model)\nBy default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "AcademicSession object" - } - ] - } - } - } - ] - }, - "CourseResult": { - "allOf": [ - { - "$ref": "#/components/schemas/Result" - }, - { - "type": "object", - "required": [ - "studyLoad" - ], - "properties": { - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - } - } - } - ] - }, - "CourseOfferingAssociation": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/CourseResult" - } - } - } - ] - }, - "CourseId": { - "type": "object", - "description": "An object describing the metadata of a course", - "required": [ - "courseId" - ], - "properties": { - "courseId": { - "type": "string", - "description": "Unique id of this course", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - } - } - }, - "CourseProperties": { - "type": "object", - "description": "An object describing the metadata of a course", - "required": [ - "name", - "abbreviation", - "description", - "teachingLanguage", - "level", - "primaryCode" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for this course. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "readOnly": true - }, - "name": { - "type": "array", - "description": "The name of this course (ECTS-title)", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Academic and Professional Writing" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation or internal code used to identify this course (ECTS-code)", - "maxLength": 256, - "example": "INFOMQNM" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "duration": { - "type": "string", - "description": "The duration of this course. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.", - "pattern": "^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)([DW]))?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$", - "example": "P1DT30H4S" - }, - "firstStartDate": { - "type": "string", - "description": "The date when participants can follow this course for the first time.", - "format": "date" - }, - "description": { - "type": "array", - "description": "The description of this course (ECTS-description).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "As with all empirical sciences, to assure valid outcomes, HCI studies heavily rely on research methods and statistics. This holds for the design of user interfaces, personalized recommender systems, and interaction paradigms for the internet of things. This course prepares you to do so by learning you to collect data, design experiments, and analyze the results. By the end of the course, you will have a detailed understanding of how to select and apply quantitative research methods and analysis to address virtually all HCI challenges. Quantitative research and data analysis will be taught in the context of state-of-the-art HCI challenges. Lectures will be alternated with hands-on learning, including work with predefined datasets (e.g., addressing facial features, cognitive load, and emotion). Additionally, students will set up their own research (e.g., using eye tracking). Data processing and analysis will be executed using R." - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this course is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "learningOutcomes": { - "type": "array", - "description": "Statements that describe the knowledge or skills students should acquire by the end of a particular course (ECTS-learningoutcome).", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms." - } - ] - } - }, - "admissionRequirements": { - "type": "array", - "description": "This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students.", - "example": [ - { - "language": "en-GB", - "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance" - } - ], - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "qualificationRequirements": { - "type": "array", - "description": "Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "enrollment": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The extra information that is provided for enrollment", - "example": [ - { - "language": "en-GB", - "value": "enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation." - } - ] - }, - "resources": { - "type": "array", - "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)", - "items": { - "type": "string" - }, - "example": [ - "book to be announced", - "on-line resource x" - ] - }, - "assessment": { - "type": "array", - "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Exam on campus" - } - ] - }, - "link": { - "type": "string", - "description": "URL of the course's website", - "format": "uri", - "maxLength": 2048, - "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM" - }, - "educationSpecification": { - "description": "The educationSpecification of which this course is a more concrete implementation. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses for this course", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationOffererCode": "123A321", - "educationLocationCode": "334X123", - "consentParticipationSTAP": "permission_granted", - "jointPartnerCodes": [ - "123A123" - ], - "foreignPartners": [ - "Harvard University" - ] - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - }, - "programs": { - "description": "The program of which this course is a part of. This object is [`expandable`](#tag/program_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Program object" - } - ] - } - }, - "coordinators": { - "description": "The person(s) responsible for this course. This object is [`expandable`](#tag/person_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "personId" - }, - { - "$ref": "#/components/schemas/Person", - "title": "Person object" - } - ] - } - }, - "organization": { - "description": "The organization that manages this group. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - } - } - }, - "Course": { - "allOf": [ - { - "$ref": "#/components/schemas/CourseId" - }, - { - "$ref": "#/components/schemas/CourseProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this course is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this course ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "CourseOffering": { - "allOf": [ - { - "$ref": "#/components/schemas/Offering" - }, - { - "type": "object", - "required": [ - "modeOfStudy", - "startDate", - "endDate" - ], - "properties": { - "startDate": { - "type": "string", - "description": "The moment on which this offering starts, RFC3339 (full-date)", - "format": "date", - "example": "2019-08-21" - }, - "endDate": { - "type": "string", - "description": "The moment on which this offering ends, RFC3339 (full-date)", - "format": "date", - "example": "2019-10-23" - }, - "enrollStartDate": { - "type": "string", - "description": "The first day on which a student can enroll for this course.", - "format": "date", - "example": "2019-05-01" - }, - "enrollEndDate": { - "type": "string", - "description": "The last day on which a student can enroll for this course.", - "format": "date", - "example": "2019-08-01" - }, - "flexibleEntryPeriodStart": { - "type": "string", - "description": "If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`.", - "format": "date" - }, - "flexibleEntryPeriodEnd": { - "type": "string", - "description": "If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`.", - "format": "date" - }, - "addresses": { - "type": "array", - "description": "Addresses for this offering", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "priceInformation": { - "type": "array", - "description": "Price information for this offering.", - "items": { - "$ref": "#/components/schemas/Cost" - } - }, - "course": { - "description": "The course that is offered in this courseoffering. [`expandable`](#tag/course_model)\nBy default only the `courseId` (a string) is returned. If the client requested an expansion of `course` the full course object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "courseId" - }, - { - "$ref": "#/components/schemas/Course", - "title": "Course object" - } - ] - }, - "programOffering": { - "description": "The programoffering where this courseoffering is related to. [`expandable`](#tag/program_offering_model)\nBy default only the `programOfferingId` (a string) is returned. If the client requested an expansion of `programOffering` the full programOffering object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programOfferingId" - }, - { - "$ref": "#/components/schemas/ProgramOffering", - "title": "ProgramOffering object" - } - ] - }, - "organization": { - "description": "The organization that manages this courseoffering. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "academicSession": { - "description": "The academicsession during which this courseoffering takes place. [`expandable`](#tag/academic_session_model)\nBy default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "AcademicSession object" - } - ] - } - } - } - ] - }, - "ComponentResult": { - "allOf": [ - { - "$ref": "#/components/schemas/Result" - }, - { - "type": "object", - "required": [ - "weight" - ], - "properties": { - "weight": { - "type": "integer", - "description": "The weight to 100 as total for this offering in the course", - "format": "int32", - "minimum": 0, - "maximum": 100, - "example": 100 - } - } - } - ] - }, - "ComponentOfferingAssociation": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/ComponentResult" - } - } - } - ] - }, - "roomType": { - "type": "string", - "description": "The type of this room\n- general purpose: algemeen\n- lecture room: collegezaal\n- computer room: computerruimte\n- laboratory: laboratorium\n- office: kantoor\n- workspace: werkruimte\n- exam location: tentamenruimte\n- study room: studieruimte\n- examination room: onderzoekskamer\n- conference room: vergaderkamer\n", - "enum": [ - "general purpose", - "lecture room", - "computer room", - "laboratory", - "office", - "workspace", - "exam location", - "study room", - "examination room", - "conference room" - ], - "example": "exam location" - }, - "Building": { - "type": "object", - "description": "An object describing a building and the properties of a building.", - "required": [ - "buildingId", - "name", - "address", - "primaryCode" - ], - "properties": { - "buildingId": { - "type": "string", - "description": "Unique id of this building", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-331214174000" - }, - "primaryCode": { - "description": "The primary human readable identifier for this building. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "buildingId", - "code": "45" - } - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of the name of this building", - "maxLength": 256, - "example": "Bb" - }, - "name": { - "type": "array", - "description": "The name of this building", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Beatrix building" - } - ] - }, - "description": { - "type": "array", - "description": "The description of this building.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "external rooms location for exams" - } - ] - }, - "address": { - "$ref": "#/components/schemas/Address" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "bagId", - "code": "0344100000139910" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Room": { - "type": "object", - "description": "An area within a building where education can take place", - "required": [ - "roomId", - "roomType", - "name", - "primaryCode" - ], - "properties": { - "roomId": { - "type": "string", - "description": "Unique id for this room", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-332114174000" - }, - "primaryCode": { - "description": "The primary human readable identifier for the room. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "roomCode", - "code": "Bb4.54" - } - }, - "roomType": { - "$ref": "#/components/schemas/roomType" - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of the name of this room", - "maxLength": 256, - "example": "Bb4.54" - }, - "name": { - "type": "array", - "description": "The name of this room", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Beatrix building room 4.54" - } - ] - }, - "description": { - "type": "array", - "description": "The description of this room. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "External education and exam room 4.54" - } - ] - }, - "totalSeats": { - "type": "integer", - "format": "int32", - "description": "The total number of seats located in the room", - "example": 300 - }, - "availableSeats": { - "type": "integer", - "format": "int32", - "description": "The total number of available (=non-reserved) seats in the room", - "example": 200 - }, - "floor": { - "type": "string", - "description": "The floor on which this room is located", - "example": "4" - }, - "wing": { - "type": "string", - "description": "The wing in which this room is located", - "example": "None" - }, - "geolocation": { - "type": "object", - "description": "Geolocation of the entrance of this room (WGS84 coordinate reference system)", - "required": [ - "latitude", - "longitude" - ], - "properties": { - "latitude": { - "type": "number", - "format": "double", - "example": 52.088255 - }, - "longitude": { - "type": "number", - "format": "double", - "example": 5.106669 - } - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "building": { - "description": "The building in which the room is located. [`expandable`](#tag/building_model)\nBy default only the `buildingId` (a string) is returned. If the client requested an expansion of `building` the full building object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "buildingId" - }, - { - "$ref": "#/components/schemas/Building", - "title": "Building object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "componentType": { - "type": "string", - "description": "The component type\n- test: tentamen\n- lecture: college\n- practical: practicum\n- tutorial: werkcollege\n- consultation: consultatie\n- project: project\n- workshop: workshop\n- excursion: excursie\n- independent study: zelfstudie\n- external: extern\n- skills training: vaardighedentraining\n", - "enum": [ - "test", - "lecture", - "practical", - "tutorial", - "consultation", - "project", - "workshop", - "excursion", - "independent study", - "external", - "skills training" - ], - "example": "test" - }, - "Component": { - "type": "object", - "description": "A component is a part of a course", - "required": [ - "componentId", - "componentType", - "name", - "teachingLanguage", - "abbreviation", - "primaryCode" - ], - "properties": { - "componentId": { - "type": "string", - "description": "Unique id of this component", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - }, - "primaryCode": { - "description": "The primary human readable identifier for this component. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "componentCode", - "code": "INFOMQNM-WRKCLG-1" - }, - "readOnly": true - }, - "componentType": { - "$ref": "#/components/schemas/componentType" - }, - "name": { - "type": "array", - "description": "The name of this component", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Written test for INFOMQNM" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of this component", - "maxLength": 256, - "example": "Test-INFOMQNM" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "duration": { - "type": "string", - "description": "The duration of this component. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.", - "pattern": "^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)([DW]))?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$", - "example": "P1DT30H4S" - }, - "description": { - "type": "array", - "description": "The description of this component.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "'Prove executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms Able to design suitable research studies (e.g., choose between within and between subject designs) Define/apply/design metrics and scales Define/produce materials (e.g., stimuli and questionnaires) Define protocols for research studies Understands and take in account concepts of reliability and validity Analyze and improve methods and analysis of published scientific articles Able to deliver scientific reports\nProve executable knowledge of ­­­statistics, including: Handle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates) Data preparation (e.g., coding and feature selection) Reason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors) Select an appropriate sampling method (e.g., stratified) Perform parametric tests (e.g., repeated measures (M)ANOVA) Perform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n" - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this component is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "learningOutcomes": { - "type": "array", - "description": "Statements that describe the knowledge or skills students should acquire by the end of a particular course (ECTS-learningoutcome).", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms." - } - ] - } - }, - "enrollment": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The extra information that is provided for enrollment", - "example": [ - { - "language": "en-GB", - "value": "enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation." - } - ] - }, - "resources": { - "type": "array", - "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)", - "items": { - "type": "string" - }, - "example": [ - "book to be announced", - "on-line resource x" - ] - }, - "assessment": { - "type": "array", - "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Exam on campus" - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses for this component", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "course": { - "description": "The course of which this component is a part. [`expandable`](#tag/course_model)\nBy default only the `courseId` (a string) is returned. If the client requested an expansion of `course` the full course object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "courseId" - }, - { - "$ref": "#/components/schemas/Course", - "title": "Course object" - } - ] - }, - "organization": { - "description": "The organization which provides this component. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "ComponentOffering": { - "allOf": [ - { - "$ref": "#/components/schemas/Offering" - }, - { - "type": "object", - "required": [ - "startDateTime", - "endDateTime" - ], - "properties": { - "startDateTime": { - "type": "string", - "description": "The moment on which this offering starts, RFC3339 (date-time)", - "format": "date-time", - "example": "2020-12-15" - }, - "endDateTime": { - "type": "string", - "description": "The moment on which this offering ends, RFC3339 (date-time)", - "format": "date-time", - "example": "2020-12-16" - }, - "enrollStartDate": { - "type": "string", - "description": "The first day on which a student can enroll for this course.", - "format": "date" - }, - "enrollEndDate": { - "type": "string", - "description": "The last day on which a student can enroll for this course.", - "format": "date" - }, - "resultWeight": { - "type": "integer", - "description": "The result weight of this offering", - "minimum": 0, - "maximum": 100, - "example": 100 - }, - "addresses": { - "type": "array", - "description": "Addresses for this offering", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "priceInformation": { - "type": "array", - "description": "Price information for this offering.", - "items": { - "$ref": "#/components/schemas/Cost" - } - }, - "room": { - "$ref": "#/components/schemas/Room" - }, - "component": { - "description": "The component that is offered in this componentoffering. [`expandable`](#tag/component_model)\nBy default only the `componentId` (a string) is returned. If the client requested an expansion of `component` the full component object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "componentId" - }, - { - "$ref": "#/components/schemas/Component", - "title": "Component object" - } - ] - }, - "courseOffering": { - "description": "The courseoffering where this componentoffering is related to. [`expandable`](#tag/course_offering_model)\nBy default only the `courseOfferingId` (a string) is returned. If the client requested an expansion of `courseOffering` the full courseOffering object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "courseOfferingId" - }, - { - "$ref": "#/components/schemas/CourseOffering", - "title": "CourseOffering object" - } - ] - }, - "organization": { - "description": "The organization that manages this componentoffering. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "academicSession": { - "description": "The academicsession during which this componentoffering takes place. [`expandable`](#tag/academic_session_model)\nBy default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "AcademicSession object" - } - ] - } - } - } - ] - }, - "groupType": { - "type": "string", - "description": "The type of this group\n- learning group: A collection of participants carrying out common learning activities\n- class: A collection of participants carrying out jointly scheduled educational activities\n- team: A collection of members of a team, either students, employees or mixed.\n", - "enum": [ - "learning group", - "class", - "team" - ], - "example": "learning group" - }, - "Group": { - "type": "object", - "description": "A group is simply a collection of persons. Groups can be used to accommodate various usecases.\n\nGroups MAY optionally have a relation to an Offering, however the meaning of such relations is left unspecified and is left up to the implementer.\n", - "required": [ - "groupId", - "groupType", - "name", - "primaryCode" - ], - "properties": { - "groupId": { - "type": "string", - "description": "Unique id for this group", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "primaryCode": { - "description": "The primary human readable identifier for this group. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "groupCode", - "code": "group-abc987" - } - }, - "groupType": { - "$ref": "#/components/schemas/groupType" - }, - "name": { - "type": "array", - "description": "The name of this group", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "statistics students" - } - ] - }, - "description": { - "type": "array", - "description": "The description of this group", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "The group of students that follow statistics classes" - } - ] - }, - "startDate": { - "type": "string", - "description": "The day on which this group starts being active, RFC3339 (full-date)", - "format": "date", - "example": "2020-08-17" - }, - "endDate": { - "type": "string", - "description": "The day on which this group ends being active, RFC3339 (full-date)", - "format": "date", - "example": "2020-12-18" - }, - "personCount": { - "type": "number", - "description": "The number of persons that are member of this group", - "format": "int32", - "minimum": 0, - "example": 183 - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "organization": { - "description": "The organization that manages this group. [`expandable`](.#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Expanded organization" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "TimelineOverrideProgram": { - "type": "object", - "description": "A time-line override of the program.", - "required": [ - "validFrom", - "program" - ], - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "program": { - "$ref": "#/components/schemas/ProgramProperties" - } - } - }, - "ProgramExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/Program" - }, - { - "type": "object", - "description": "These properties are only present when explicitly included. This allows for creating and displaying structures of programs", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideProgram" - } - } - } - } - ] - }, - "TimelineOverrideCourse": { - "type": "object", - "required": [ - "validFrom", - "course" - ], - "description": "A timeline override of the course.", - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "course": { - "$ref": "#/components/schemas/CourseProperties" - } - } - }, - "CourseExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/Course" - }, - { - "type": "object", - "description": "These properties are only present when explicitly included", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideCourse" - } - } - } - } - ] - }, - "ProgramOfferingAssociationExpandable": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/ProgramResult" - }, - "person": { - "$ref": "#/components/schemas/PersonId" - } - } - } - ] - }, - "CourseOfferingAssociationExpandable": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/CourseResult" - }, - "person": { - "$ref": "#/components/schemas/PersonId" - } - } - } - ] - }, - "ComponentOfferingAssociationExpandable": { - "allOf": [ - { - "$ref": "#/components/schemas/Association" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "#/components/schemas/ComponentResult" - }, - "person": { - "$ref": "#/components/schemas/PersonId" - } - } - } - ] - }, - "AssociationFull": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProgramOfferingAssociation" - }, - { - "$ref": "#/components/schemas/CourseOfferingAssociation" - }, - { - "$ref": "#/components/schemas/ComponentOfferingAssociation" - } - ], - "properties": { - "person": { - "readOnly": true, - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "personId" - }, - { - "$ref": "#/components/schemas/Person", - "title": "Person" - } - ] - }, - "offering": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "offeringId" - }, - { - "$ref": "#/components/schemas/ComponentOffering", - "title": "ComponentOffering" - }, - { - "$ref": "#/components/schemas/CourseOffering", - "title": "CourseOffering" - }, - { - "$ref": "#/components/schemas/ProgramOffering", - "title": "ProgramOffering" - } - ] - } - } - }, - "AssociationWrite": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProgramOfferingAssociation" - }, - { - "$ref": "#/components/schemas/CourseOfferingAssociation" - }, - { - "$ref": "#/components/schemas/ComponentOfferingAssociation" - } - ], - "properties": { - "offering": { - "description": "The offering this association is for", - "oneOf": [ - { - "$ref": "#/components/schemas/ComponentOffering", - "title": "ComponentOffering" - }, - { - "$ref": "#/components/schemas/CourseOffering", - "title": "CourseOffering" - }, - { - "$ref": "#/components/schemas/ProgramOffering", - "title": "ProgramOffering" - } - ] - } - } - }, - "NewsFeed": { - "type": "object", - "description": "A placeholder or collection of news items", - "required": [ - "newsFeedId", - "newsFeedType", - "name", - "description" - ], - "properties": { - "newsFeedId": { - "type": "string", - "description": "Unique id for this news feed", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-134564174222" - }, - "newsFeedType": { - "type": "string", - "description": "The type of the object this news feed relates to", - "enum": [ - "organization", - "program", - "course", - "component", - "person", - "building", - "room" - ], - "example": "room" - }, - "name": { - "type": "array", - "description": "The name for this news feed", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "room Bb 4.35 news" - } - ] - }, - "description": { - "type": "array", - "description": "The description of this news feed.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "all information on what happens in room Bb 4.35" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "newsItemType": { - "type": "string", - "description": "The type of this news item\n- calamity: calamiteit\n- general: algemeen\n- schedule-change: roosterwijziging\n- announcement: aankondiging\n", - "enum": [ - "calamity", - "general", - "schedule-change", - "announcement" - ] - }, - "NewsItem": { - "type": "object", - "description": "A newsitem contains the message and metadata of that message", - "required": [ - "newsItemId", - "name" - ], - "properties": { - "newsItemId": { - "type": "string", - "description": "Unique id for this news item", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-122564174000" - }, - "newsItemType": { - "$ref": "#/components/schemas/newsItemType" - }, - "name": { - "type": "array", - "description": "The name for this news item", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Room Bb 4.35 will be un available from 2020-09-29 until 2020-09-30" - } - ] - }, - "authors": { - "type": "array", - "description": "The authors of the article with this news item", - "items": { - "type": "string", - "maxLength": 256 - }, - "example": [ - "admin@universiteitvanharderwijk.nl" - ] - }, - "image": { - "type": "string", - "description": "The url containing the address of the image belonging to this news item", - "format": "uri", - "maxLength": 2048, - "example": "https://upload.wikimedia.org/wikipedia/commons/4/44/Antu_emblem-unavailable.svg" - }, - "link": { - "type": "string", - "description": "The url containing the address of the article belonging to this news item", - "format": "uri", - "maxLength": 2048, - "example": "https://www.universiteitvanharderwijk.nl/cms/ruimtegebrek" - }, - "content": { - "type": "array", - "description": "The content of this news item.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "The room Bb 4.35 will be under maintenance" - } - ] - }, - "newsFeeds": { - "description": "The newsFeeds where this item can be found. [`expandable`](#tag/news_feed_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "newsFeedId" - }, - { - "$ref": "#/components/schemas/NewsFeed", - "title": "NewsFeed" - } - ] - } - }, - "validFrom": { - "type": "string", - "description": "The moment from which this news item is valid, RFC3339 (date-time)", - "format": "date-time", - "example": "2020-09-28T08:30:00.000Z" - }, - "validUntil": { - "type": "string", - "description": "The moment until which this news item is valid, RFC3339 (date-time)", - "format": "date-time", - "example": "2020-09-30T20:00:00.000Z" - }, - "lastModified": { - "type": "string", - "description": "The moment on which this news item was updated, RFC3339 (date-time)", - "format": "date-time", - "example": "2020-09-28T00:00:00.000Z" - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "TimelineOverrideEducationSpecification": { - "type": "object", - "description": "A timeline override of the EducationSpecification.", - "required": [ - "validFrom", - "educationSpecification" - ], - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "educationSpecification": { - "$ref": "#/components/schemas/EducationSpecificationProperties" - } - } - }, - "EducationSpecificationExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/EducationSpecification" - }, - { - "type": "object", - "title": "With timelineOverrides", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideEducationSpecification" - } - } - } - } - ] - } - }, - "responses": { - "ErrorBadRequest": { - "description": "Bad request", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorUnauthorized": { - "description": "Unauthorized", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorForbidden": { - "description": "Forbidden", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorNotFound": { - "description": "Not Found", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorMethodNotAllowed": { - "description": "Method not allowed", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorTooManyRequests": { - "description": "Too many requests", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorInternalServerError": { - "description": "Internal Server Error", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - } - }, - "parameters": { - "primaryCode": { - "name": "primaryCode", - "in": "query", - "description": "The primaryCode of the requested item. This is often the source identifier as defined by the institution.", - "required": false, - "schema": { - "type": "string" - } - }, - "pageSize": { - "name": "pageSize", - "in": "query", - "description": "The number of items per page", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 10, - "enum": [ - 10, - 20, - 50, - 100, - 250 - ] - } - }, - "pageNumber": { - "name": "pageNumber", - "in": "query", - "description": "The page number to get. Page numbers start at 1.", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "example": 1, - "minimum": 1 - } - }, - "consumer": { - "name": "consumer", - "in": "query", - "description": "Request entities meant for a specific consumer. This query parameter is independent from the `consumers` attribute. See the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "required": false, - "schema": { - "type": "string" - } - }, - "personSearch": { - "name": "q", - "in": "query", - "description": "Filter by persons having a givenName, surNamePrefix, surname, displayName, initials, mail or secondaryMail containing the given search term (exact partial match, case insensitive)", - "required": false, - "schema": { - "type": "string" - } - }, - "search": { - "name": "q", - "in": "query", - "description": "Filter by items having a name, abbreviation or description containing the given search term (exact partial match, case insensitive)", - "required": false, - "schema": { - "type": "string" - } - }, - "teachingLanguage": { - "name": "teachingLanguage", - "in": "query", - "description": "Filter by teachingLanguage, which is a string describing the main teaching language, should be a three-letter language code as specified by ISO 639-2.", - "required": false, - "schema": { - "type": "string", - "pattern": "^[a-z]{3}$", - "minLength": 3, - "maxLength": 3 - }, - "example": "nld" - }, - "returnTimelineOverrides": { - "name": "returnTimelineOverrides", - "in": "query", - "description": "Controls whether the attribute `timelineOverrides` is returned or not. The default is `false`, so this has to explicitly set to `true` if a client needs the timeline overrides. See [GET /education-specifications/{educationSpecificationId}](#tag/education-specifications/paths/~1education-specifications~1{educationSpecificationId}/get) for an example.", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - } - } - }, - "paths": { - "/": { - "get": { - "parameters": [], - "summary": "GET /", - "description": "Get metadata for the service.", - "tags": [ - "service metadata" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Service" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/persons": { - "get": { - "summary": "GET /persons", - "description": "Get an ordered list of all persons.", - "tags": [ - "persons" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/personSearch" - }, - { - "name": "affiliations", - "in": "query", - "description": "Filter by affiliations", - "required": false, - "schema": { - "$ref": "#/components/schemas/personAffiliations" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "personId", - "givenName", - "surName", - "displayName", - "-personId", - "-givenName", - "-surName", - "-displayName" - ] - }, - "default": [ - "personId" - ], - "example": [ - "surName", - "-personId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Person" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - }, - "post": { - "summary": "POST /persons", - "description": "POST a single person.", - "tags": [ - "persons" - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/PersonProperties" - } - ] - } - } - } - }, - "responses": { - "201": { - "description": "CREATED", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/PersonId" - }, - { - "$ref": "#/components/schemas/PostResponse" - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - } - } - } - }, - "/persons/me": { - "get": { - "summary": "GET /persons/me", - "description": "Returns the person object for the currently authenticated user.", - "security": [ - { - "bearerAuth": [] - } - ], - "tags": [ - "persons" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Person" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/persons/{personId}": { - "get": { - "summary": "GET /persons/{personId}", - "description": "Get a single person.", - "tags": [ - "persons" - ], - "parameters": [ - { - "name": "personId", - "in": "path", - "description": "User ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Person" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/persons/{personId}/associations": { - "get": { - "summary": "GET /persons/{personId}/associations", - "description": "Get a list of all associations for an individual person.", - "tags": [ - "persons" - ], - "parameters": [ - { - "name": "personId", - "in": "path", - "description": "Person ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "name": "associationType", - "in": "query", - "description": "Filter by association type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "programOffering", - "courseOffering", - "componentOffering" - ] - } - }, - { - "name": "role", - "in": "query", - "description": "Filter by role", - "required": false, - "schema": { - "$ref": "#/components/schemas/associationRole" - } - }, - { - "name": "state", - "in": "query", - "description": "Filter by state", - "required": false, - "schema": { - "$ref": "#/components/schemas/associationState" - } - }, - { - "name": "result-state", - "in": "query", - "description": "Filter by result state", - "required": false, - "schema": { - "$ref": "#/components/schemas/resultState" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "associationId", - "-associationId" - ] - }, - "default": [ - "associationId" - ], - "example": [ - "associationId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "oneOf": [ - { - "allOf": [ - { - "$ref": "#/components/schemas/ProgramOfferingAssociation" - }, - { - "type": "object", - "required": [ - "offering" - ], - "properties": { - "offering": { - "$ref": "#/components/schemas/ProgramOffering" - }, - "academicSession": { - "$ref": "#/components/schemas/AcademicSession" - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/CourseOfferingAssociation" - }, - { - "type": "object", - "required": [ - "offering" - ], - "properties": { - "offering": { - "$ref": "#/components/schemas/CourseOffering" - }, - "academicSession": { - "$ref": "#/components/schemas/AcademicSession" - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/ComponentOfferingAssociation" - }, - { - "type": "object", - "required": [ - "offering" - ], - "properties": { - "offering": { - "$ref": "#/components/schemas/ComponentOffering" - }, - "academicSession": { - "$ref": "#/components/schemas/AcademicSession" - } - } - } - ] - } - ] - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/persons/{personId}/groups": { - "get": { - "summary": "GET /persons/{personId}/groups", - "description": "Get an ordered list of all groups for a given person, ordered by name.", - "tags": [ - "persons" - ], - "parameters": [ - { - "name": "personId", - "in": "path", - "description": "Person ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "groupType", - "in": "query", - "description": "Filter by group type", - "required": false, - "schema": { - "$ref": "#/components/schemas/groupType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "groupId", - "name", - "startDate", - "-groupId", - "-name", - "-startDate" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-groupId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page" - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number" - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Group" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations": { - "get": { - "summary": "GET /organizations", - "description": "Get an ordered list of all organizations, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "organizationType", - "in": "query", - "description": "Filter by organization type", - "required": false, - "schema": { - "$ref": "#/components/schemas/organizationType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "organizationId", - "name", - "-organizationId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-organizationId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Organization" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}": { - "get": { - "summary": "GET /organizations/{organizationId}", - "description": "Get a single organization.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Organization" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/programs": { - "get": { - "summary": "GET /organizations/{organizationId}/programs", - "description": "Get an ordered list of all programs for a given organization, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "programType", - "in": "query", - "description": "Filter by program type", - "required": false, - "schema": { - "$ref": "#/components/schemas/programType" - } - }, - { - "name": "qualificationAwarded", - "in": "query", - "description": "Filter by qualificationAwarded", - "required": false, - "schema": { - "$ref": "#/components/schemas/qualificationAwarded" - } - }, - { - "name": "levelOfQualification", - "in": "query", - "description": "Filter by levelOfQualification", - "required": false, - "schema": { - "$ref": "#/components/schemas/levelOfQualification" - } - }, - { - "name": "sector", - "in": "query", - "description": "Filter by sector", - "required": false, - "schema": { - "$ref": "#/components/schemas/sector" - } - }, - { - "name": "fieldsOfStudy", - "in": "query", - "description": "Filter by fieldsOfStudy", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programId", - "name", - "-programId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-programId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Program" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/courses": { - "get": { - "summary": "GET /organizations/{organizationId}/courses", - "description": "Get an ordered list of all courses for a given organization, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "level", - "in": "query", - "description": "Filter by level", - "required": false, - "schema": { - "$ref": "#/components/schemas/level" - } - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "courseId", - "name", - "-courseId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-courseId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/components": { - "get": { - "summary": "GET /organizations/{organizationId}/components", - "description": "Get an ordered list of all components for a given organization, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "componentType", - "in": "query", - "description": "Filter by component type", - "required": false, - "schema": { - "$ref": "#/components/schemas/componentType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "componentId", - "name", - "-componentId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "componentId", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Component" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/offerings": { - "get": { - "summary": "GET /organizations/{organizationId}/offerings", - "description": "Get a list of all offerings for a given organization", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "offeringType", - "in": "query", - "description": "Filter by offering type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "program", - "course", - "component" - ] - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "name", - "-startDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ProgramOffering" - }, - { - "$ref": "#/components/schemas/CourseOffering" - }, - { - "$ref": "#/components/schemas/ComponentOffering" - } - ] - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/groups": { - "get": { - "summary": "GET /organizations/{organizationId}/groups", - "description": "Get an ordered list of all groups for a given organization, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "groupType", - "in": "query", - "description": "Filter by group type", - "required": false, - "schema": { - "$ref": "#/components/schemas/groupType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "groupId", - "name", - "startDate", - "-groupId", - "-name", - "-startDate" - ] - }, - "default": [ - "name" - ], - "example": [ - "groupId", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Group" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/organizations/{organizationId}/education-specifications": { - "get": { - "summary": "GET /organizations/{organizationId}/education-specifications", - "description": "Get an ordered list of all EducationSpecifications for a given organization, ordered by name.", - "tags": [ - "organizations" - ], - "parameters": [ - { - "name": "organizationId", - "in": "path", - "description": "Organization ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "educationSpecificationType", - "in": "query", - "description": "Filter by type of education specification", - "required": false, - "schema": { - "$ref": "#/components/schemas/educationSpecificationType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "educationSpecificationType", - "name", - "primarycode", - "-educationSpecificationType", - "-name", - "-primarycode" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-educationSpecificationType" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EducationSpecification" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/academic-sessions": { - "get": { - "summary": "GET /academic-sessions", - "description": "Get a list of all academic sessions, ordered chronologically.", - "tags": [ - "academic sessions" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "name": "academicSessionType", - "in": "query", - "description": "Filter by academic session type", - "required": false, - "schema": { - "$ref": "#/components/schemas/academicSessionType" - } - }, - { - "name": "parent", - "in": "query", - "description": "Filter by parent (academicSessionId)", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "year", - "in": "query", - "description": "Filter by year (academicSessionId)", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "academicSessionId", - "name", - "startDate", - "-academicSessionId", - "-name", - "-startDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "startDate", - "-academicSessionId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AcademicSession" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/academic-sessions/{academicSessionId}": { - "get": { - "summary": "GET /academic-sessions/{academicSessionId}", - "description": "Get a single academic session.", - "tags": [ - "academic sessions" - ], - "parameters": [ - { - "name": "academicSessionId", - "in": "path", - "description": "Academic session ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children", - "year" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AcademicSession" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/academic-sessions/{academicSessionId}/offerings": { - "get": { - "summary": "GET /academic-sessions/{academicSessionId}/offerings", - "description": "Get a list of all offerings during this academic session", - "tags": [ - "academic sessions" - ], - "parameters": [ - { - "name": "academicSessionId", - "in": "path", - "description": "Academic session ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "offeringType", - "in": "query", - "description": "Filter by offering type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "program", - "course", - "component" - ] - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "startDate", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ProgramOffering" - }, - { - "$ref": "#/components/schemas/CourseOffering" - }, - { - "$ref": "#/components/schemas/ComponentOffering" - } - ] - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs": { - "get": { - "summary": "GET /programs", - "description": "Get an ordered list of all programs, ordered by name.", - "tags": [ - "programs" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "programType", - "in": "query", - "description": "Filter by program type", - "required": false, - "schema": { - "$ref": "#/components/schemas/programType" - } - }, - { - "name": "qualificationAwarded", - "in": "query", - "description": "Filter by qualificationAwarded", - "required": false, - "schema": { - "$ref": "#/components/schemas/qualificationAwarded" - } - }, - { - "name": "levelOfQualification", - "in": "query", - "description": "Filter by levelOfQualification", - "required": false, - "schema": { - "$ref": "#/components/schemas/levelOfQualification" - } - }, - { - "name": "sector", - "in": "query", - "description": "Filter by sector", - "required": false, - "schema": { - "$ref": "#/components/schemas/sector" - } - }, - { - "name": "fieldsOfStudy", - "in": "query", - "description": "Filter by fieldsOfStudy", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programId", - "name", - "-programId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "programId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Program" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}": { - "get": { - "summary": "GET /programs/{programId}", - "description": "Get a single program.", - "tags": [ - "programs" - ], - "parameters": [ - { - "name": "programId", - "in": "path", - "description": "Program ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children", - "coordinators", - "organization", - "educationSpecification" - ] - } - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProgramExpanded" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}/programs": { - "get": { - "summary": "GET /programs/{programId}/programs", - "description": "Get an ordered list of nested programs, ordered by name.", - "tags": [ - "programs" - ], - "parameters": [ - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "programId", - "in": "path", - "description": "the id of the program to find nested programs for", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "programType", - "in": "query", - "description": "Filter by program type", - "required": false, - "schema": { - "$ref": "#/components/schemas/programType" - } - }, - { - "name": "qualificationAwarded", - "in": "query", - "description": "Filter by qualificationAwarded", - "required": false, - "schema": { - "$ref": "#/components/schemas/qualificationAwarded" - } - }, - { - "name": "levelOfQualification", - "in": "query", - "description": "Filter by levelOfQualification", - "required": false, - "schema": { - "$ref": "#/components/schemas/levelOfQualification" - } - }, - { - "name": "sector", - "in": "query", - "description": "Filter by sector", - "required": false, - "schema": { - "$ref": "#/components/schemas/sector" - } - }, - { - "name": "fieldsOfStudy", - "in": "query", - "description": "Filter by fieldsOfStudy", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programId", - "name", - "-programId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-programId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Program" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}/courses": { - "get": { - "summary": "GET /programs/{programId}/courses", - "description": "Get an ordered list of all courses given through this program.", - "tags": [ - "programs" - ], - "parameters": [ - { - "name": "programId", - "in": "path", - "description": "Program ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "level", - "in": "query", - "description": "Filter by level", - "required": false, - "schema": { - "$ref": "#/components/schemas/level" - } - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "courseId", - "name", - "-courseId", - "-name" - ] - }, - "default": [ - "courseId" - ], - "example": [ - "name", - "-courseId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}/offerings": { - "get": { - "summary": "GET /programs/{programId}/offerings", - "description": "Get a list of all offerings for this program, ordered chronologically.", - "tags": [ - "programs" - ], - "parameters": [ - { - "name": "programId", - "in": "path", - "description": "Program ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "modeOfStudy", - "in": "query", - "description": "Filter by modeOfStudy", - "required": false, - "schema": { - "$ref": "#/components/schemas/modeOfStudy" - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "name", - "-startDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProgramOffering" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses": { - "get": { - "summary": "GET /courses", - "description": "Get a list of all courses, ordered by name (ascending).", - "tags": [ - "courses" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "level", - "in": "query", - "description": "Filter by level", - "required": false, - "schema": { - "$ref": "#/components/schemas/level" - } - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "courseId", - "name", - "-courseId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-courseId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses/{courseId}": { - "get": { - "summary": "GET /courses/{courseId}", - "description": "Get a single course.", - "tags": [ - "courses" - ], - "parameters": [ - { - "name": "courseId", - "in": "path", - "description": "Course ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programs", - "coordinators", - "organization", - "educationSpecification" - ] - } - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CourseExpanded" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses/{courseId}/components": { - "get": { - "summary": "GET /courses/{courseId}/components", - "description": "Get an ordered list of all course components.", - "tags": [ - "courses" - ], - "parameters": [ - { - "name": "courseId", - "in": "path", - "description": "Course ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "componentType", - "in": "query", - "description": "Filter by component type", - "required": false, - "schema": { - "$ref": "#/components/schemas/componentType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "componentId", - "name", - "-componentId", - "-name" - ] - }, - "default": [ - "componentId" - ], - "example": [ - "name", - "-componentId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Component" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses/{courseId}/offerings": { - "get": { - "summary": "GET /courses/{courseId}/offerings", - "description": "Get a list of all offerings for this course, ordered chronologically.", - "tags": [ - "courses" - ], - "parameters": [ - { - "name": "courseId", - "in": "path", - "description": "Course ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "offeringId", - "-endDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CourseOffering" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/components/{componentId}": { - "get": { - "summary": "GET /components/{componentId}", - "description": "Get a single component.", - "tags": [ - "components" - ], - "parameters": [ - { - "name": "componentId", - "in": "path", - "description": "component ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "course", - "organization" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Component" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/components/{componentId}/offerings": { - "get": { - "summary": "GET /components/{componentId}/offerings", - "description": "Get a list of all offerings for this component, ordered chronologically.", - "tags": [ - "components" - ], - "parameters": [ - { - "name": "componentId", - "in": "path", - "description": "Component ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDateTime", - "endDateTime", - "-offeringId", - "-name", - "-startDateTime", - "-endDateTime" - ] - }, - "default": [ - "startDateTime" - ], - "example": [ - "offeringId", - "-startDateTime" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ComponentOffering" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/offerings/{offeringId}": { - "get": { - "summary": "GET /offerings/{offeringId}", - "description": "Get a single offering.", - "tags": [ - "offerings" - ], - "parameters": [ - { - "name": "offeringId", - "in": "path", - "description": "Offering ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "program", - "programOffering", - "course", - "courseOffering", - "component", - "organization", - "academicSession" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/CourseOffering", - "title": "courseOffering" - }, - { - "$ref": "#/components/schemas/ComponentOffering", - "title": "componentOffering" - }, - { - "$ref": "#/components/schemas/ProgramOffering", - "title": "programOffering" - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/offerings/{offeringId}/associations": { - "get": { - "summary": "GET /offerings/{offeringId}/associations", - "description": "Get a list of all offering associations.", - "tags": [ - "offerings" - ], - "parameters": [ - { - "name": "offeringId", - "in": "path", - "description": "Offering ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "name": "associationType", - "in": "query", - "description": "Filter by association type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "programOffering", - "courseOffering", - "componentOffering" - ] - } - }, - { - "name": "role", - "in": "query", - "description": "Filter by role", - "required": false, - "schema": { - "$ref": "#/components/schemas/associationRole" - } - }, - { - "name": "state", - "in": "query", - "description": "Filter by state", - "required": false, - "schema": { - "$ref": "#/components/schemas/associationState" - } - }, - { - "name": "result-state", - "in": "query", - "description": "Filter by result state", - "required": false, - "schema": { - "$ref": "#/components/schemas/resultState" - } - }, - { - "name": "sort", - "in": "query", - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "associationId", - "-associationId" - ] - }, - "default": [ - "associationId" - ], - "example": [ - "associationId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ProgramOfferingAssociationExpandable" - }, - { - "$ref": "#/components/schemas/CourseOfferingAssociationExpandable" - }, - { - "$ref": "#/components/schemas/ComponentOfferingAssociationExpandable" - } - ] - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/offerings/{offeringId}/groups": { - "get": { - "summary": "GET /offerings/{offeringId}/groups", - "description": "Get an ordered list of all groups related to an offering, ordered by name.", - "tags": [ - "offerings" - ], - "parameters": [ - { - "name": "offeringId", - "in": "path", - "description": "Offering ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "groupType", - "in": "query", - "description": "Filter by group type", - "required": false, - "schema": { - "$ref": "#/components/schemas/groupType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "groupId", - "name", - "startDate", - "-groupId", - "-name", - "-startDate" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-startDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page" - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number" - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Group" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/associations/{associationId}": { - "get": { - "summary": "GET /associations/{associationId}", - "description": "Get a single association.", - "tags": [ - "associations" - ], - "parameters": [ - { - "name": "associationId", - "in": "path", - "description": "Association ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "person", - "offering" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AssociationFull" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - }, - "patch": { - "summary": "PATCH /associations/{associationId}", - "description": "Update the status or result of an enrollment. Other elements of the association object COULD \nalso be PATCHED. But are not likely and have therefor not been included in this endpoint.\nImplementation of the PATCH activity is based on use PATCH with JSON Merge Patch standard, \na specialized media type `application/merge-patch+json` for partial resource representation \nto update parts of resource objects.\n", - "security": [ - { - "openId": [ - "associations.write" - ] - } - ], - "tags": [ - "associations" - ], - "parameters": [ - { - "name": "associationId", - "in": "path", - "description": "The id of the association to update", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/merge-patch+json": { - "schema": { - "properties": { - "remoteState": { - "$ref": "#/components/schemas/remoteAssociationState" - }, - "result": { - "oneOf": [ - { - "$ref": "#/components/schemas/ComponentResult" - }, - { - "$ref": "#/components/schemas/CourseResult" - }, - { - "$ref": "#/components/schemas/ProgramResult" - } - ] - } - } - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/AssociationId" - }, - { - "$ref": "#/components/schemas/PostResponse" - }, - { - "properties": { - "state": { - "$ref": "#/components/schemas/associationState" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - } - } - } - }, - "/associations/external/me": { - "post": { - "summary": "POST /associations/external/me", - "description": "POST a single association enroll a person based on person information obtained from .wellknown endpoint, an offering, \nand the organization/type=root information form the organization that is issuing this association. \nThe offering can either be identified by an offeringId if known or the full offering details. \n", - "security": [ - { - "openId": [ - "associations:external:me.write" - ] - } - ], - "tags": [ - "associations" - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "required": [ - "remoteState" - ], - "allOf": [ - { - "$ref": "#/components/schemas/AssociationWrite" - }, - { - "properties": { - "issuer": { - "$ref": "#/components/schemas/Organization" - } - } - } - ] - } - } - } - }, - "responses": { - "201": { - "description": "CREATED", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/AssociationId" - }, - { - "$ref": "#/components/schemas/PostResponse" - }, - { - "properties": { - "state": { - "$ref": "#/components/schemas/associationState" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - } - } - } - }, - "/buildings": { - "get": { - "summary": "GET /buildings", - "description": "Get a list of all buildings, ordered by name (ascending).", - "tags": [ - "buildings" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "buildingId", - "name", - "-buildingId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-buildingId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Building" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/buildings/{buildingId}": { - "get": { - "summary": "GET /buildings/{buildingId}", - "description": "Get a single building.", - "tags": [ - "buildings" - ], - "parameters": [ - { - "name": "buildingId", - "in": "path", - "description": "Building ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Building" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/buildings/{buildingId}/rooms": { - "get": { - "summary": "GET /buildings/{buildingId}/rooms", - "description": "Get a list of all rooms in a building.", - "tags": [ - "buildings" - ], - "parameters": [ - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "buildingId", - "in": "path", - "description": "The id of the building to find rooms for", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "roomType", - "in": "query", - "description": "Filter by room type", - "required": false, - "schema": { - "$ref": "#/components/schemas/roomType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "roomId", - "name", - "totalSeats", - "availableSeats", - "-roomId", - "-name", - "-totalSeats", - "-availableSeats" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-availableSeats" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Room" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/rooms": { - "get": { - "summary": "GET /rooms", - "description": "Get a list of all rooms, ordered by name (ascending).", - "tags": [ - "rooms" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "roomType", - "in": "query", - "description": "Filter by room type", - "required": false, - "schema": { - "$ref": "#/components/schemas/roomType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "roomId", - "name", - "totalSeats", - "availableSeats", - "-roomId", - "-name", - "-totalSeats", - "-availableSeats" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-availableSeats" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Room" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/rooms/{roomId}": { - "get": { - "summary": "GET /rooms/{roomId}", - "description": "Get a single room.", - "tags": [ - "rooms" - ], - "parameters": [ - { - "name": "roomId", - "in": "path", - "description": "Room ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "building" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Room" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/news-feeds": { - "get": { - "summary": "GET /news-feeds", - "description": "Get a list of all news feeds, ordered by title.", - "tags": [ - "news" - ], - "parameters": [ - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "newsFeedType", - "in": "query", - "description": "Filter by news type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "organization", - "program", - "course", - "component", - "person", - "building", - "room" - ] - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "newsFeedId", - "name", - "-newsFeedId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-newsFeedId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NewsFeed" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/news-feeds/{newsFeedId}": { - "get": { - "summary": "GET /news-feeds/{newsFeedId}", - "description": "Get a single news feed.", - "tags": [ - "news" - ], - "parameters": [ - { - "name": "newsFeedId", - "in": "path", - "description": "News feed ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewsFeed" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/news-feeds/{newsFeedId}/news-items": { - "get": { - "summary": "GET /news-feeds/{newsFeedId}/news-items", - "description": "Get an ordered list of all news items.", - "tags": [ - "news" - ], - "parameters": [ - { - "name": "newsFeedId", - "in": "path", - "description": "News feed ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "author", - "in": "query", - "description": "Filter by author", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "newsItemId", - "name", - "validFrom", - "validUntil", - "lastModified", - "-newsItemId", - "-name", - "-validFrom", - "-validUntil", - "-lastModified" - ] - }, - "default": [ - "newsItemId" - ], - "example": [ - "validFrom", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NewsItem" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/news-items/{newsItemId}": { - "get": { - "summary": "GET /news-items/{newsItemId}", - "description": "Get a single news item.", - "tags": [ - "news" - ], - "parameters": [ - { - "name": "newsItemId", - "in": "path", - "description": "News item ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "newsFeeds" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewsItem" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications": { - "get": { - "summary": "GET /education-specifications", - "description": "Get a list of all education specifications, ordered by name (ascending).", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "educationSpecificationType", - "in": "query", - "description": "Filter by type of education specification", - "required": false, - "schema": { - "$ref": "#/components/schemas/educationSpecificationType" - } - }, - { - "name": "primaryCode", - "in": "query", - "description": "Filter by primary code of education specification", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "educationSpecificationType", - "name", - "primaryCode", - "-educationSpecificationType", - "-name", - "-primaryCode" - ] - }, - "default": [ - [ - "name" - ] - ], - "example": [ - "educationSpecificationType", - "-primaryCode" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EducationSpecification" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications/{educationSpecificationId}": { - "get": { - "summary": "GET /education-specifications/{educationSpecificationId}", - "description": "Get a single education specification.", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "name": "educationSpecificationId", - "in": "path", - "description": "Education specification ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children", - "organization" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "title": "Without timelineOverrides (default)", - "$ref": "#/components/schemas/EducationSpecification" - }, - { - "title": "With timelineOverrides", - "$ref": "#/components/schemas/EducationSpecificationExpanded" - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications/{educationSpecificationId}/education-specifications": { - "get": { - "summary": "GET /education-specifications/{educationSpecificationId}/education-specifications", - "description": "Get an ordered list of all education-specifications given through this educationspecification.", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "name": "educationSpecificationId", - "in": "path", - "description": "Education Specification ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "educationSpecificationId", - "name", - "educationSpecificationType", - "-educationSpecificationId", - "-name", - "-educationSpecificationType" - ] - }, - "default": [ - "educationSpecificationId" - ], - "example": [ - "educationSpecificationId", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications/{educationSpecificationId}/courses": { - "get": { - "summary": "GET /education-specifications/{educationSpecificationId}/courses", - "description": "Get an ordered list of all courses given through this EducationSpecification.", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "name": "educationSpecificationId", - "in": "path", - "description": "Education Specification ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "level", - "in": "query", - "description": "Filter by level", - "required": false, - "schema": { - "$ref": "#/components/schemas/level" - } - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "courseId", - "name", - "-courseId", - "-name" - ] - }, - "default": [ - "courseId" - ], - "example": [ - "courseId", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications/{educationSpecificationId}/programs": { - "get": { - "summary": "GET /education-specifications/{educationSpecificationId}/programs", - "description": "Get an ordered list of all programs for a given education specification, ordered by name.", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "name": "educationSpecificationId", - "in": "path", - "description": "Education Specification ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "programType", - "in": "query", - "description": "Filter by program type", - "required": false, - "schema": { - "$ref": "#/components/schemas/programType" - } - }, - { - "name": "qualificationAwarded", - "in": "query", - "description": "Filter by qualificationAwarded", - "required": false, - "schema": { - "$ref": "#/components/schemas/qualificationAwarded" - } - }, - { - "name": "levelOfQualification", - "in": "query", - "description": "Filter by levelOfQualification", - "required": false, - "schema": { - "$ref": "#/components/schemas/levelOfQualification" - } - }, - { - "name": "sector", - "in": "query", - "description": "Filter by sector", - "required": false, - "schema": { - "$ref": "#/components/schemas/sector" - } - }, - { - "name": "fieldsOfStudy", - "in": "query", - "description": "Filter by fieldsOfStudy", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "croho-creboCode", - "in": "query", - "description": "Filter by croho-creboCode", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programId", - "name", - "-programId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "programId", - "-name" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Program" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/groups": { - "get": { - "summary": "GET /groups", - "description": "Get a list of all groups, ordered by name (ascending).", - "tags": [ - "groups" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "groupType", - "in": "query", - "description": "Filter by group type", - "required": false, - "schema": { - "$ref": "#/components/schemas/groupType" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "groupId", - "name", - "startDate", - "-groupId", - "-name", - "-startDate" - ] - }, - "default": [ - "name" - ], - "example": [ - "groupId", - "-startDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page" - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number" - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Group" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/groups/{groupId}": { - "get": { - "summary": "GET /groups/{groupId}", - "description": "Get a single group.", - "tags": [ - "groups" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "Group ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "description": "Optional properties to expand, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "organization" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Group" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/groups/{groupId}/persons": { - "get": { - "summary": "GET /groups/{groupId}/persons", - "description": "Get an ordered list of all persons that are member of a given group, ordered by personId.", - "tags": [ - "groups" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "Group ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/personSearch" - }, - { - "name": "affiliations", - "in": "query", - "description": "Filter by affiliations", - "required": false, - "schema": { - "$ref": "#/components/schemas/personAffiliations" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "personId", - "givenName", - "surName", - "displayName", - "-personId", - "-givenName", - "-surName", - "-displayName" - ] - }, - "default": [ - "personId" - ], - "example": [ - "personId", - "-givenName" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page" - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number" - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page" - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages" - }, - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Person" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - } - } -} diff --git a/profiles/rio b/profiles/rio deleted file mode 100644 index 3724b21..0000000 --- a/profiles/rio +++ /dev/null @@ -1,57 +0,0 @@ -{:openapi-spec "rio.openapi.json" - :seeds - [{:method "get" - :path "/courses" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/education-specifications" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/programs" - :query-params {"consumer" "rio"}}] - - :rules - [;; page through items list for any kind of entity, assumes consumer query param is present - {:match [[:request :method, "get"] - [:request :path ?path] - [:request :query-params "consumer" ?consumer] - [:response :status 200] - [:response, :body, "pageNumber", ?pageNumber] - [:response, :body, "hasNextPage", true]] - :generates [{:method "get" - :path ?path - :query-params {"pageNumber" "{(inc ?pageNumber)}" ;; params must be strings - "consumer" ?consumer}}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "courseId" ?id]] - :generates [{:method "get" - :path "/courses/{?id}" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/courses/{?id}/offerings" - :query-params {"consumer" "rio"}}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "educationSpecificationId" ?id]] - :generates [{:method "get" - :path "/education-specifications/{?id}" - :query-params {"consumer" "rio"}}]} - - {:match [[:request, :method, "get"] - [:response :status 200] - [:response, :body, "items", ?i "programId" ?id]] - :generates [{:method "get" - :path "/programs/{?id}" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/programs/{?id}/programs" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/programs/{?id}/courses" - :query-params {"consumer" "rio"}} - {:method "get" - :path "/programs/{?id}/offerings" - :query-params {"consumer" "rio"}}]}]} diff --git a/profiles/rio.openapi.json b/profiles/rio.openapi.json deleted file mode 100644 index 2dfe3a0..0000000 --- a/profiles/rio.openapi.json +++ /dev/null @@ -1,4273 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "version": "5.0.0", - "title": "Open Education API", - "description": "OpenAPI (fka Swagger) specification for the Open Education API.\n\n
\n\t\n \"OOAPI\n \n
OOAPI information model that feeds OOAPI specification (click to enlage)
\n
\n\nThe model provides an overview of how the objects on which the API is specified are related. The overarching concept educations is not found in the in the end points of the API. The smaller concepts of programOffering, courseOffering and conceptOffering are all found in the offering endpoint. The different types of association can all be found in the association endpoint.\n\nThe original file for this model can be found here\n\nThe program relations object is not found as a separate endpoint but relations between programs can be found within the program endpoint by expanding that endpoint.\n\nInformation about earlier meetings and presentations can be found here\n\nInformation on the EDU-API model that was also used for this api is shown here\n", - "x-logo": { - "url": "../logo.png" - } - }, - "servers": [ - { - "url": "http://demo01.eduapi.nl/v5", - "description": "SURF demo implementation" - } - ], - "tags": [ - { - "name": "service metadata", - "description": "The service API provides additional metadata needed to make the OOAPI fit for this organization." - }, - { - "name": "academic sessions", - "description": "The academic sessions API provides information about the different time periods a program can be offered." - }, - { - "name": "associations", - "description": "The associations API provides information about the association between an offering and a person (e.g. students, lecturers, etc).\nAssociations can be posted between institutions This requires information details on the offering and the persons.\nTo allow for this information a complete person object and offering object can be part of the API.\nThe structure is explained in the following model:\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
offering
studentexternal
internalPOST /associations/external/me gets student details from .wellknown at home institution. It passes offering details (provided by external institution) to the home institution so the home institution can create a placeholder for the offering and its results. \n
externalno support needed
\nDirect update of current information: PATCH /associations/{associationId}\nThis call is currently limited to passing results and a remote state. For future use other association resource information could be passed. \nMore information on the support for student mobility can be found \nhere\n" - }, - { - "name": "buildings", - "description": "The building API provides a building that is currently used by the organization. Including all location details." - }, - { - "name": "courses", - "description": "The courses API provides a self-contained and formally structured learning experience. Aimed at providing learning outcomes to students. Usually placed in the context of a program." - }, - { - "name": "components", - "description": "The components API provides information about components being part of parent courses." - }, - { - "name": "education specifications", - "description": "The education specification API provides information on the specification of an education object.\nThis specification allows for other education objects to be derived from it.\nIt is used to aggregate education objects from a supplying institution.\nIt clusters programs to a main educationSpecification that is used in registries such as RIO.\n" - }, - { - "name": "groups", - "description": "The groups API provides information about groups that are related to organizations, persons and offerings. Groups of students that are related to an offering are typically used for rostering. The rostering application assigns students based on these groups. For example, class 1b will be assigned to the course offering on monday morning. Not all groups are related to an offering. A group of people can also be a team that is working on a task outside the OOAPI scope. These can be teams of students, but also teams of employees." - }, - { - "name": "news", - "description": "The news API provides news feeds and items regarding a specific subject." - }, - { - "name": "offerings", - "description": "The offerings API provides information about offerings which have a global timeframe, e.g. a period to which students can enroll." - }, - { - "name": "organizations", - "description": "The organizations API provides the organizations that are responsible for the execution and recognition of education." - }, - { - "name": "persons", - "description": "The persons API provides information about persons related to an organization." - }, - { - "name": "programs", - "description": "The programs API provides a coherent set of educational components, aimed at the realization of competences or objectives in the field of knowledge, insight, attitudes and skills that the person who completes the program must have." - }, - { - "name": "rooms", - "description": "The rooms API provides the part of a building where an activity can take place. Including detail information on the resources available, number of seats, etc. (Updated continuously)" - }, - { - "name": "service_model", - "x-displayName": "Service", - "description": "\n" - }, - { - "name": "education_specification_model", - "x-displayName": "EducationSpecification", - "description": "\n" - }, - { - "name": "program_model", - "x-displayName": "Program", - "description": "\n" - }, - { - "name": "course_model", - "x-displayName": "Course", - "description": "\n" - }, - { - "name": "component_model", - "x-displayName": "Component", - "description": "\n" - }, - { - "name": "program_offering_model", - "x-displayName": "ProgramOffering", - "description": "\n" - }, - { - "name": "course_offering_model", - "x-displayName": "CourseOffering", - "description": "\n" - }, - { - "name": "component_offering_model", - "x-displayName": "ComponentOffering", - "description": "\n" - }, - { - "name": "association_model", - "x-displayName": "Association", - "description": "\n" - }, - { - "name": "person_model", - "x-displayName": "Person", - "description": "\n" - }, - { - "name": "group_model", - "x-displayName": "Group", - "description": "\n" - }, - { - "name": "academic_session_model", - "x-displayName": "AcademicSession", - "description": "\n" - }, - { - "name": "organization_model", - "x-displayName": "Organization", - "description": "\n" - }, - { - "name": "building_model", - "x-displayName": "Building", - "description": "\n" - }, - { - "name": "room_model", - "x-displayName": "Room", - "description": "\n" - }, - { - "name": "news_feed_model", - "x-displayName": "NewsFeed", - "description": "\n" - }, - { - "name": "news_item_model", - "x-displayName": "NewsItem", - "description": "\n" - } - ], - "x-tagGroups": [ - { - "name": "Requests and respones", - "tags": [ - "service metadata", - "academic sessions", - "associations", - "buildings", - "courses", - "components", - "education specifications", - "groups", - "news", - "offerings", - "organizations", - "persons", - "programs", - "rooms" - ] - }, - { - "name": "Models", - "tags": [ - "service_model", - "academic_session_model", - "association_model", - "building_model", - "component_model", - "component_offering_model", - "course_model", - "course_offering_model", - "education_specification_model", - "group_model", - "news_feed_model", - "news_item_model", - "organization_model", - "person_model", - "program_model", - "program_offering_model", - "room_model" - ] - } - ], - "components": { - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer" - }, - "openId": { - "type": "openIdConnect", - "openIdConnectUrl": "https://example.nl/.well-known/openid-configuration" - } - }, - "schemas": { - "Consumer": { - "type": "object", - "description": "Object for communicating data to a specific consumer (destination). This object has no relationship with the `consumer` query parameter.", - "required": [ - "consumerKey" - ], - "properties": { - "consumerKey": { - "description": "The key of the consumer (destination) for which this information is intended. See the [consumer registry](https://open-education-api.github.io/specification/#/consumers) for more information.", - "type": "string" - } - }, - "additionalProperties": true - }, - "Ext": { - "type": "object", - "description": "Object for additional non-standard attributes" - }, - "Service": { - "type": "object", - "description": "A metadataset providing details on the provider of this OOAPI implementation", - "required": [ - "contactEmail", - "specification", - "documentation" - ], - "properties": { - "contactEmail": { - "type": "string", - "description": "Contact e-mail address of the service owner", - "format": "email", - "maxLength": 256, - "example": "admin@universiteitvanharderwijk.nl" - }, - "specification": { - "type": "string", - "description": "URL of the API specification (YAML or JSON, compliant with [Open API Specification v3](https://github.com/OAI/OpenAPI-Specification/))", - "format": "uri", - "maxLength": 2048, - "example": "https://rawgit.com/open-education-api/specification/v3/docs.html#tag/course-offerings/paths/~1course-offerings/get" - }, - "documentation": { - "type": "string", - "description": "URL of the API documentation, including general terms and privacy statement", - "format": "uri", - "maxLength": 2048, - "example": "https://open-education-api.github.io/specification/v4/docs.html" - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Problem": { - "type": "object", - "description": "A system message including the error code and an explanation", - "required": [ - "status", - "title" - ], - "properties": { - "status": { - "type": "string", - "description": "The HTTP status code", - "example": "404" - }, - "title": { - "type": "string", - "description": "A short, human-readable summary of the problem type", - "example": "Resource not found" - }, - "detail": { - "type": "string", - "description": "A human-readable explanation specific to this occurrence of the problem" - } - } - }, - "programType": { - "type": "string", - "description": "The type of this program\n- program: opleiding\n- minor: minor\n- honours: honours\n- specialization: specialisatie\n- track: track\n", - "enum": [ - "program", - "minor", - "honours", - "specialization", - "track" - ], - "example": "program" - }, - "qualificationAwarded": { - "type": "string", - "description": "Type of qualificaton that can be obtained on finishing the program", - "enum": [ - "AD", - "BA", - "BSc", - "LLB", - "MA", - "MSc", - "LLM", - "Phd", - "None" - ], - "example": "None" - }, - "levelOfQualification": { - "type": "string", - "description": "Level of qualification according to the Dutch National Qualification Framework and the European Qualifications Framework, see [this overview](https://nlqf.nl/images/downloads/English2018/Schematic_overview_NLQF_2020.pdf) for more information.", - "enum": [ - "1", - "2", - "3", - "4", - "4+", - "5", - "6", - "7", - "8" - ], - "example": "6" - }, - "sector": { - "type": "string", - "description": "The sector for this program\n- secondary vocational education: middelbaar beroepsonderwijs\n- higher professional education: hoger beroepsonderwijs\n- university education: universitair onderwijs\n", - "enum": [ - "secondary vocational education", - "higher professional education", - "university education" - ], - "example": "university education" - }, - "Pagination": { - "type": "object", - "required": [ - "pageSize", - "pageNumber", - "hasPreviousPage", - "hasNextPage", - "items" - ], - "properties": { - "pageSize": { - "type": "integer", - "format": "int32", - "description": "The number of items per page", - "example": 10 - }, - "pageNumber": { - "type": "integer", - "format": "int32", - "description": "The current page number", - "example": 1, - "minimum": 1 - }, - "hasPreviousPage": { - "type": "boolean", - "description": "Whether there is a previous page", - "example": false - }, - "hasNextPage": { - "type": "boolean", - "description": "Whether there is a previous page", - "example": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "description": "Total number of pages", - "example": 8 - } - } - }, - "ProgramId": { - "type": "object", - "description": "A collection of courses that lead to a certifiable learning outcome", - "required": [ - "programId" - ], - "properties": { - "programId": { - "type": "string", - "description": "Unique id for this program", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - } - } - }, - "codeType": { - "type": "string", - "description": "The code/identifier type. \n\nThis is an *extensible enumeration*. Use `x-` to prefix custom values\n\nThe predefined values are:\n - `brin`: The registration number for a Dutch educational institution that is issued by the Dutch Ministry of Education, Culture and Science\n - `crohoCreboCode`: programs with a CREBO and CROHO number are accredited by the Dutch Ministry of Education, Culture and Science (OCW)\n - `programCode`: Identifier for the program (collection of courses)\n - `componentCode`: The code for a component (part of a course)\n - `offeringCode`: The code to identify a specific offering (program, course or component offering)\n - `organizationId`: The identifier for the organization\n - `buildingId`: The number or code to identify a building\n - `bagId`: The identification of a building as it is known in the Dutch Building Administration (BAG)\n - `roomCode`: The code for a room\n - `systemId`: Identifier assigned to an entity in context of a specific system\n - `productId`: Identifier assigned to a specific product\n - `nationalIdentityNumber`: Identifier assigned by the governement of the person. e.g. a social security number in the USA\n - `studentNumber`: Identifier for the student\n - `studielinkNumber`: Identifier for the person as determined by Studielink\n - `esi`: European Student Identifier\n - `userName`: The name of a user\n - `accountId`: Identifier assigned to a specific account\n - `emailAdress`: An email address\n - `groupCode`: The identifier for a group (of persons)\n - `isbn`: International Standard Book Number that serve as product identifiers for Books\n - `issn`: International Standard Book Number that serve as product identifiers for periodicals\n - `orcId`: Open Researcher and Contributor ID\n - `uuid`: A universally unique identifier\n - `schacHome`: Home organization using the domain name of the organization\n - `identifier`: Generic Identifier\n", - "x-ooapi-extensible-enum": [ - "brin", - "crohoCreboCode", - "programCode", - "componentCode", - "offeringCode", - "organizationId", - "buildingId", - "bagId", - "roomCode", - "systemId", - "productId", - "nationalIdentityNumber", - "studentNumber", - "studielinkNumber", - "esi", - "userName", - "accountId", - "emailAdress", - "groupCode", - "isbn", - "issn", - "orcId", - "uuid", - "schacHome", - "identifier" - ], - "example": "identifier" - }, - "IdentifierEntry": { - "type": "object", - "properties": { - "codeType": { - "$ref": "#/components/schemas/codeType" - }, - "code": { - "description": "Human readable value for the code/identifier", - "type": "string" - } - }, - "required": [ - "codeType", - "code" - ], - "additionalProperties": false, - "example": { - "codeType": "identifier", - "code": "1234qwe12" - } - }, - "LanguageTypedString": { - "type": "object", - "description": "A String with an associated language code.", - "properties": { - "language": { - "description": "The language used in the described entity. A string formatted according to RFC3066.", - "type": "string", - "pattern": "^[a-z]{2,4}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$" - }, - "value": { - "description": "String to describe the entity.", - "type": "string" - } - }, - "example": { - "language": "en-GB", - "value": "program that is a place holder for all courses that are made available for student mobility" - } - }, - "StudyLoadDescriptor": { - "type": "object", - "description": "The amount of effort to complete this education in the specified unit.", - "properties": { - "studyLoadUnit": { - "description": "The unit in which the studyload is specfied\n- contacttime: CONTACTUUR\tamount of time spent in classes\n- ects: ECTS_PUNT\tEuropean Credit Transfer System\n- sbu: SBU\tstudentloadhours\n- sp: STUDIEPUNT studentpoints\n- hour: UUR\thours\n", - "type": "string", - "enum": [ - "contacttime", - "ects", - "sbu", - "sp", - "hour" - ], - "example": "ects" - }, - "value": { - "description": "The amount of load depicted in numbers", - "type": "number", - "example": 3 - } - }, - "example": { - "studyLoadUnit": "ects", - "value": 3 - } - }, - "modeOfStudy": { - "type": "string", - "description": "Indicates whether the education is full-time, part-time, dual or self-paced.\n - full-time: fulltime\n - part-time: parttime\n - dual training: duaal\n - self-paced: eigen tempo\n", - "enum": [ - "full-time", - "part-time", - "dual training", - "self-paced" - ] - }, - "modesOfDelivery": { - "type": "array", - "description": "The mode of delivery of the component (ECTS-mode of delivery)\n- distance-learning: afstandsleren\n- on campus: op de campus\n- online: online\n- hybrid: hybride\n- situated: op locatie\n", - "items": { - "type": "string", - "enum": [ - "distance-learning", - "on campus", - "online", - "hybrid", - "situated" - ], - "example": "situated" - } - }, - "level": { - "type": "string", - "description": "The level of this course (ECTS-year of study if applicable)\n- secondary vocational education: mbo\n- secondary vocational education 1: mbo 1, corresponds to levelOfQualification 1\n- secondary vocational education 2: mbo 2, corresponds to levelOfQualification 2\n- secondary vocational education 3: mbo 3, corresponds to levelOfQualification 3\n- secondary vocational education 4: mbo 4, corresponds to levelOfQualification 4\n- associate degree: associate degree, corresponds to levelOfQualification 5\n- bachelor: bachelor, corresponds to levelOfQualification 6\n- master: master, corresponds to levelOfQualification 7\n- doctoral: doctoraal, corresponds to levelOfQualification 8\n- undefined: onbepaald\n- undivided: ongedeeld\n- nt2-1: NT2 niveau 1\n- nt2-2: NT2 niveau 2\n", - "enum": [ - "secondary vocational education", - "secondary vocational education 1", - "secondary vocational education 2", - "secondary vocational education 3", - "secondary vocational education 4", - "associate degree", - "bachelor", - "master", - "doctoral", - "undefined", - "undivided", - "nt2-1", - "nt2-2" - ], - "example": "master" - }, - "Identifier": { - "type": "string", - "description": "An identifier of another resource.", - "format": "uuid" - }, - "EducationSpecificationId": { - "type": "object", - "properties": { - "educationSpecificationId": { - "type": "string", - "description": "Unique id for this education specification", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - } - }, - "required": [ - "educationSpecificationId" - ] - }, - "educationSpecificationType": { - "type": "string", - "description": "The type of education specification\n - program: HOOPLEIDING\n - privateProgram: PARTICULIEREOPLEIDING\n - programCluster: HOONDERWIJSEENHEDENCLUSTER\n - course: HOONDERWIJSEENHEID\n", - "enum": [ - "program", - "privateProgram", - "cluster", - "course" - ], - "example": "program" - }, - "formalDocument": { - "type": "string", - "description": "The type of formal document obtained after completion of this education\n - diploma: DIPLOMA\n - certificate: CERTIFICAAT\n - no official document: GEEN OFFICIEEL DOCUMENT\n - testimonial: GETUIGSCHRIFT\n - school advice: SCHOOLADVIES\n", - "enum": [ - "diploma", - "certificate", - "no official document", - "testimonial", - "school advice" - ], - "example": "diploma" - }, - "EducationSpecification": { - "allOf": [ - { - "$ref": "#/components/schemas/EducationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecificationProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this EducationSpecification is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this EducationSpecification ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "organizationType": { - "type": "string", - "description": "The type of this organization. Each OOAPI endpoint should have a single organization with type `root`, describing the root organization.\n- root: the root of this organization, representing the Educational Institution itself\n- institute: instituut\n- department: departement\n- faculty: faculteit\n- branch: vestiging\n- academy: academie\n- school: school\n", - "enum": [ - "root", - "institute", - "department", - "faculty", - "branch", - "academy", - "school" - ], - "example": "root" - }, - "addressType": { - "type": "string", - "description": "Address type\n- postal: post\n- visit: bezoek\n- deliveries: bezorg\n- billing: factuur\n- teaching: the address where education takes place\n", - "enum": [ - "postal", - "visit", - "deliveries", - "billing", - "teaching" - ] - }, - "Address": { - "type": "object", - "description": "The full street address", - "required": [ - "addressType" - ], - "properties": { - "addressType": { - "$ref": "#/components/schemas/addressType" - }, - "street": { - "type": "string", - "description": "The street name", - "example": "Moreelsepark" - }, - "streetNumber": { - "type": "string", - "description": "The street number", - "example": "48" - }, - "additional": { - "type": "array", - "description": "Further details like building name, suite, apartment number, etc.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "On the other side of the road" - } - ] - }, - "postalCode": { - "type": "string", - "description": "Postal code", - "example": "3511 EP" - }, - "city": { - "type": "string", - "description": "name of the city / locality", - "example": "Utrecht" - }, - "countryCode": { - "type": "string", - "description": "the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)", - "example": "NL" - }, - "geolocation": { - "type": "object", - "description": "Geolocation of the entrance of this address (WGS84 coordinate reference system)", - "required": [ - "latitude", - "longitude" - ], - "properties": { - "latitude": { - "type": "number", - "format": "double", - "example": 52.089123 - }, - "longitude": { - "type": "number", - "format": "double", - "example": 5.113337 - } - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Organization": { - "type": "object", - "description": "A description of a group of people working together to achieve a goal", - "required": [ - "organizationId", - "organizationType", - "name", - "shortName", - "primaryCode" - ], - "properties": { - "organizationId": { - "type": "string", - "description": "Unique id of this organization", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-123514174000", - "readOnly": true - }, - "primaryCode": { - "description": "The primary human readable identifier for the organization. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "orgId", - "code": "Org01-Root" - }, - "readOnly": true - }, - "organizationType": { - "$ref": "#/components/schemas/organizationType" - }, - "name": { - "type": "array", - "description": "The name of the organization", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "nl-NL", - "value": "Coöperatie SURF U.A." - } - ] - }, - "shortName": { - "type": "string", - "description": "Short name of the organization", - "maxLength": 256, - "example": "SURF" - }, - "description": { - "type": "array", - "description": "Any general description of the organization should clearly mention the type of higher education organization, especially in the case of a binary system. In Dutch; universiteit (university) or hogeschool (university of applied sciences).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "nl-NL", - "value": "SURF is een coöperatieve vereniging van Nederlandse onderwijs- en onderzoeksinstellingen waarin de leden hun krachten bundelen. De leden zijn eigenaar van SURF." - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses of this organization", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "link": { - "type": "string", - "description": "URL of the organization's website", - "format": "uri", - "maxLength": 2048, - "example": "https://surf.nl" - }, - "logo": { - "type": "string", - "description": "Logo of this organization", - "format": "uri", - "maxLength": 2048, - "example": "https://www.surf.nl/themes/surf/logo.svg" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "brin", - "code": "00AA" - }, - { - "codeType": "kvk", - "code": "12345678" - } - ] - }, - "parent": { - "description": "The organizational unit which is the parent of this organization. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "children": { - "type": "array", - "description": "All the organizational units for which this organization is the parent. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "EducationSpecificationProperties": { - "type": "object", - "description": "The specification of an education object. This specification allows for other education objects to be derived from it.\nIt is used to aggregate education objects from a supplying institution.\nIt clusters programs to a main educationSpecification that is used in registries such as RIO. \n", - "required": [ - "primaryCode", - "educationSpecificationType", - "name" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the entity. \nThis will often take the form of a human readable code as defined by the institution or region\n", - "$ref": "#/components/schemas/IdentifierEntry" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "crohoCreboCode", - "code": "1234123" - } - ] - }, - "educationSpecificationType": { - "$ref": "#/components/schemas/educationSpecificationType" - }, - "name": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The name of this education specification", - "example": [ - { - "language": "en-GB", - "value": "Bachelor Chemical technology" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of this program", - "maxLength": 256, - "example": "B Scheikundige Technologie" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The description of this program. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation.", - "example": [ - { - "language": "en-GB", - "value": "program that is a place holder for all courses that are made available for student mobility" - } - ] - }, - "formalDocument": { - "$ref": "#/components/schemas/formalDocument" - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "sector": { - "$ref": "#/components/schemas/sector" - }, - "levelOfQualification": { - "$ref": "#/components/schemas/levelOfQualification" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "learningOutcomes": { - "type": "array", - "description": "Statements that describe the knowledge or skills students should acquire by the end of a particular course or program (ECTS-learningoutcome).", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of Chemical technology, including: Acquire knowledge of research paradigms." - } - ] - } - }, - "link": { - "type": "string", - "description": "URL of the program's website", - "format": "uri", - "maxLength": 2048, - "example": "https://bijvak.nl" - }, - "parent": { - "description": "The educationSpecification that is the parent of this educationSpecification if it exists. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "children": { - "type": "array", - "description": "The EducationSpecifications that have this EducationSpecification as their parent. [`expandable`](#tag/education_specification_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - } - }, - "organization": { - "description": "The organization that manages this group. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationSpecificationSubType": "variant", - "category": [ - "business_and_project_support", - "economy" - ] - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Program": { - "allOf": [ - { - "$ref": "#/components/schemas/ProgramId" - }, - { - "$ref": "#/components/schemas/ProgramProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this program is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this program ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "PersonId": { - "type": "object", - "properties": { - "personId": { - "type": "string", - "description": "Unique id of this person", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000" - } - }, - "required": [ - "personId" - ] - }, - "personAffiliations": { - "type": "array", - "description": "The affiliations of this person, the relations a person has with the organization providing this endpoint\n- student: student\n- employee: medewerker\n- guest: gast\n", - "items": { - "type": "string", - "enum": [ - "student", - "employee", - "guest" - ], - "example": "student" - } - }, - "gender": { - "type": "string", - "description": "The gender of this person", - "enum": [ - "M", - "F", - "U", - "X" - ], - "example": "F" - }, - "ICERelationType": { - "type": "string", - "description": "Type of relation between person and In Case of Emergency contact", - "enum": [ - "partner", - "parent", - "other" - ], - "example": "partner" - }, - "PersonProperties": { - "type": "object", - "description": "A person that has a relationship with this institution", - "required": [ - "givenName", - "surname", - "displayName", - "affiliations", - "mail", - "primaryCode", - "activeEnrollment" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the person. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "studentNumber", - "code": 0 - }, - "readOnly": true - }, - "givenName": { - "type": "string", - "description": "The first name of this person", - "maxLength": 256, - "example": "Maartje" - }, - "surnamePrefix": { - "type": "string", - "description": "The prefix of the family name of this person", - "example": "van" - }, - "surname": { - "type": "string", - "description": "The family name of this person", - "maxLength": 256, - "example": "Damme" - }, - "displayName": { - "type": "string", - "description": "The name of this person which will be displayed", - "maxLength": 256, - "example": "Maartje van Damme" - }, - "initials": { - "type": "string", - "description": "The initials of this person", - "example": "MCW" - }, - "activeEnrollment": { - "type": "boolean", - "description": "Whether this person has an active enrollment.", - "example": false - }, - "dateOfBirth": { - "type": "string", - "description": "The date of birth of this person, RFC3339 (full-date)", - "format": "date", - "example": "2003-09-30" - }, - "cityOfBirth": { - "type": "string", - "description": "The city of birth of this person", - "example": "Utrecht" - }, - "countryOfBirth": { - "type": "string", - "description": "The country of birth of this person the country code according to [iso-3166-1-alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)", - "example": "NL" - }, - "nationality": { - "type": "string", - "description": "The nationality of this person the nationality according to https://gist.github.com/zspine/2365808", - "example": "Dutch" - }, - "dateOfNationality": { - "type": "string", - "description": "The date of nationality of this person, RFC3339 (full-date)", - "format": "date", - "example": "2003-09-30" - }, - "affiliations": { - "$ref": "#/components/schemas/personAffiliations" - }, - "mail": { - "type": "string", - "description": "The primary e-mailaddress of this person", - "format": "email", - "maxLength": 256, - "example": "vandamme.mcw@universiteitvanharderwijk.nl" - }, - "secondaryMail": { - "type": "string", - "description": "The secondary e-mailaddress of this person", - "format": "email", - "maxLength": 256, - "example": "poekie@xyz.nl" - }, - "telephoneNumber": { - "type": "string", - "description": "The telephone number of this person", - "maxLength": 256, - "example": "+31 123 456 789" - }, - "mobileNumber": { - "type": "string", - "description": "The mobile number of this person", - "maxLength": 256, - "example": "+31 612 345 678" - }, - "photoSocial": { - "type": "string", - "description": "The url of the informal picture of this person", - "format": "uri", - "maxLength": 2048, - "example": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Placeholder_female_superhero_c.png/203px-Placeholder_female_superhero_c.png" - }, - "photoOfficial": { - "type": "string", - "description": "The url of the official picture of this person", - "format": "uri", - "maxLength": 2048, - "example": "https://upload.wikimedia.org/wikipedia/commons/6/66/Johannes_Vermeer_%281632-1675%29_-_The_Girl_With_The_Pearl_Earring_%281665%29.jpg" - }, - "gender": { - "$ref": "#/components/schemas/gender" - }, - "titlePrefix": { - "type": "string", - "description": "A title prefix to be used for this person", - "example": "drs" - }, - "titleSuffix": { - "type": "string", - "description": "A title suffix to be used for this person", - "example": "BSc" - }, - "office": { - "type": "string", - "description": "The name of the office where this person is located" - }, - "address": { - "$ref": "#/components/schemas/Address" - }, - "ICEName": { - "type": "string", - "description": "Full name of In Case of Emergency contact", - "maxLength": 256, - "example": "Janne" - }, - "ICEPhoneNumber": { - "type": "string", - "description": "Phone number of In Case of Emergency contact", - "maxLength": 256, - "example": "+31 623 456 789" - }, - "ICERelation": { - "$ref": "#/components/schemas/ICERelationType" - }, - "languageOfChoice": { - "type": "array", - "description": "The language(s) of choice for this person, RFC3066", - "items": { - "type": "string", - "example": "nl-NL" - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "nationalIdentityNumber", - "code": "00000" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Person": { - "allOf": [ - { - "$ref": "#/components/schemas/PersonId" - }, - { - "$ref": "#/components/schemas/PersonProperties" - } - ] - }, - "ProgramProperties": { - "type": "object", - "description": "A collection of courses that lead to a certifiable learning outcome", - "required": [ - "programType", - "name", - "abbreviation", - "description", - "primaryCode", - "teachingLanguage" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for the program. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "programCode", - "code": "BIO" - }, - "readOnly": true - }, - "programType": { - "$ref": "#/components/schemas/programType" - }, - "name": { - "description": "The name of this program", - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Biology" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation of this program", - "maxLength": 256, - "example": "BIO" - }, - "description": { - "type": "array", - "description": "The description of this program", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "The study of life" - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this program is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "qualificationAwarded": { - "$ref": "#/components/schemas/qualificationAwarded" - }, - "modeOfStudy": { - "$ref": "#/components/schemas/modeOfStudy" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "duration": { - "type": "string", - "description": "The duration of this program. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.", - "pattern": "^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)([DW]))?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$", - "example": "P1DT30H4S" - }, - "firstStartDate": { - "type": "string", - "description": "The date when participants can follow this program for the first time.", - "format": "date" - }, - "levelOfQualification": { - "$ref": "#/components/schemas/levelOfQualification" - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "sector": { - "$ref": "#/components/schemas/sector" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "enrollment": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The extra information that is provided for enrollment", - "example": [ - { - "language": "en-GB", - "value": "enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation." - } - ] - }, - "resources": { - "type": "array", - "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)", - "items": { - "type": "string" - }, - "example": [ - "book to be announced", - "on-line resource x" - ] - }, - "learningOutcomes": { - "type": "array", - "description": "List of learning outcomes at program level. It is advisable to limit the number of learning outcomes to approximately 20. It is also advisable to make sure that the program learning outcomes in the course catalogue correspond with those on the Diploma Supplement.", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms." - } - ] - } - }, - "assessment": { - "type": "array", - "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Exam on campus" - } - ] - }, - "admissionRequirements": { - "type": "array", - "description": "This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students.", - "example": [ - { - "language": "en-GB", - "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance" - } - ], - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "qualificationRequirements": { - "type": "array", - "description": "Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "link": { - "type": "string", - "description": "URL of the program's website", - "format": "uri", - "maxLength": 2048, - "example": "https://bijvak.nl" - }, - "educationSpecification": { - "description": "The educationSpecification of which this program is a more concrete implementation. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - }, - "example": [ - { - "codeType": "crohoCreboCode", - "code": "59312" - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses for this program", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "parent": { - "description": "Parent program of which the current program is a child. This object is [`expandable`](#tag/program_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Expanded Program" - } - ] - }, - "children": { - "type": "array", - "description": "Programs which are a part of this program (e.g specializations). This object is [`expandable`](#tag/program_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Expanded Program" - } - ] - } - }, - "coordinators": { - "description": "The person(s) responsible for this program. This object is [`expandable`](#tag/person_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "personId" - }, - { - "$ref": "#/components/schemas/Person", - "title": "Person object" - } - ] - } - }, - "organization": { - "description": "The organization providing this program. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationOffererCode": "122A112", - "educationLocationCode": "123X122", - "consentParticipationSTAP": "permission_granted", - "jointPartnerCodes": [ - "122A113" - ], - "foreignPartners": [ - "Harvard University" - ], - "deficiency": "deficiencies", - "requirementsActivities": "requirements", - "propaedeuticPhase": "no_propaedeutic_phase", - "studyChoiceCheck": "no_study_choice_check", - "acceleratedRoute": "accelerated_route" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "TimelineOverrideProgram": { - "type": "object", - "description": "A time-line override of the program.", - "required": [ - "validFrom", - "program" - ], - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "program": { - "$ref": "#/components/schemas/ProgramProperties" - } - } - }, - "ProgramRioConsumer": { - "allOf": [ - { - "$ref": "#/components/schemas/Consumer" - }, - { - "required": [ - "educationOffererCode", - "consentParticipationSTAP" - ], - "properties": { - "consumerKey": { - "const": "rio" - }, - "educationOffererCode": { - "type": "string", - "description": "onderwijsaanbiedercode\nEen betekenisloze identifier voor een onderwijsaanbieder in de Registratie Instellingen en Opleidingen.\n", - "pattern": "^(?:\\d{3}A\\d{3})$" - }, - "educationLocationCode": { - "type": "string", - "description": "onderwijslocatiecode\nEen betekenisloze identifier voor een onderwijslocatie in de Registratie Instellingen en Opleidingen.\n", - "pattern": "^(?:\\d{3}X\\d{3})$" - }, - "consentParticipationSTAP": { - "type": "string", - "description": "toestemmingDeelnameSTAP\nGeeft aan of een AangebodenOpleiding beschikbaar is in het kader van de STAP-regeling en voorkomt in het Scholingsregister.\n", - "enum": [ - "permission_granted", - "permission_not_granted" - ] - }, - "jointPartnerCodes": { - "type": "array", - "items": { - "type": "string", - "pattern": "^(?:\\d{3}A\\d{3})$" - }, - "minItems": 1, - "description": "samenwerkendeOnderwijsaanbiedercode\nCode van de onderwijsaanbieder waarmee wordt samengewerkt OnderwijsaanbiederID-v01\n" - }, - "foreignPartners": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "description": "buitenlandsePartner\nBeschrijving van de organisatie waarmee door een Nederlandse onderwijsbestuur wordt samengewerkt\nbij het verzorgen van een Joint Degree.\n" - }, - "deficiency": { - "type": "string", - "description": "deficientie Geeft aan of inschrijving met onvoldoende vooropleiding mogelijk is\n- deficiencies: DEFICIENTIES\t\t\tInschrijving mogelijk met onvoldoende vooropleiding\n- no_dediciencies: GEEN_DEFICIENTIES\t\t\tInschrijving alleen mogelijk met voldoende vooropleiding\n", - "enum": [ - "deficiencies", - "no_deficiencies" - ] - }, - "requirementsActivities": { - "type": "string", - "description": "eisenWerkzaamheden\nGeeft aan of er eisen zijn gesteld aan het type werkzaamheden die verricht worden in het kader van de opleiding.\n- requirements: EISEN\t\t\tEr zijn eisen gesteld aan de werkzaamheden in het kader van de opleiding\n- no_requirements: GEEN_EISEN\t\t\tEr zijn geen eisen gesteld aan de werkzaamheden in het kader van de opleiding\n", - "enum": [ - "requirements", - "no_requirements" - ] - }, - "propaedeuticPhase": { - "type": "string", - "description": "propadeutischeFase\nGeeft aan of de aangeboden opleiding een propedeutische fase kent en of deze wordt afgesloten met een propedeutisch examen.\n- no_propaedeutic_phase: GEEN_PROPEDEUTISCHE_FASE\t\t\tGeen propedeutische fase\n- propaedeutic_phase_exam: PROPEDEUTISCHE_FASE_EXAMEN\t\t\tPropedeutische fase met examen\n- propaedeutic_phase_no_exam: PROPEDEUTISCHE_FASE_ZONDER_EXAMEN\t\t\tPropedeutische fase zonder examen\n", - "enum": [ - "no_propaedeutic_phase", - "propaedeutic_phase_exam", - "propaedeutic_phase_no_exam" - ] - }, - "studyChoiceCheck": { - "type": "string", - "description": "studiekeuzecheck\nSpecificeert of er en zo ja hoe een controle op geschiktheid van een aankomend student voor deelname aan gekozen studie plaatsvindt.\n- no_study_choice_check: GEEN_STUDIEKEUZE_CHECK\t\t\tGeen studiekeuzecheck\n- study_choice_check_available: STUDIEKEUZE_CHECK_VAN_TOEPASSING\t\t\tStudiekeuzecheck van toepassing\n- study_choice_check_mandatory: STUDIEKEUZE_CHECK_VERPLICHT\t\t\tStudiekeuzecheck verplicht\n", - "enum": [ - "no_study_choice_check", - "study_choice_check_available", - "study_choice_check_mandatory" - ] - }, - "acceleratedRoute": { - "type": "string", - "description": "versneldTraject\nGeeft aan of een student een versneld programma volgt zodat het opleiding in minder tijd dan normaal doorlopen kan worden.\n- accelerated_route: VERSNELD_TRAJECT\t\t\tVersneld traject\n- no_accelerated_route: GEEN_VERSNELD_TRAJECT\t\t\tGeen versneld traject\n", - "enum": [ - "accelerated_route", - "no_accelerated_route" - ] - } - } - } - ] - }, - "ProgramExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/Program" - }, - { - "type": "object", - "description": "These properties are only present when explicitly included. This allows for creating and displaying structures of programs", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideProgram" - } - } - } - } - ], - "required": [ - "programId", - "programType", - "name", - "abbreviation", - "description", - "primaryCode", - "teachingLanguage", - "validFrom", - "educationSpecification", - "duration" - ], - "properties": { - "consumers": { - "contains": { - "$ref": "#/components/schemas/ProgramRioConsumer" - } - } - } - }, - "OfferingId": { - "type": "object", - "description": "ID of Either a program, course or component offering which descrbes the program, course or offering in time", - "required": [ - "offeringId" - ], - "properties": { - "offeringId": { - "type": "string", - "description": "Unique id of this offering", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-134564174000", - "readOnly": true - } - } - }, - "academicSessionType": { - "type": "string", - "description": "The type of this Academic Session This is an *extensible enumeration*.\n- academic year: academic year\n- semester: semester, typically there are two semesters per academic year\n- trimester: trimester, typically there are three semesters per academic year\n- quarter: quarter, typically there are four quarters per academic year\n- testing period: a period in which tests take place\n- period: any other period in an academic year\n\nImplementations are allowed to add additional values to those above, as long as they do not overlap in definition to existing values.\n", - "example": "semester", - "x-ooapi-extensible-enum": [ - "academic year", - "semester", - "trimester", - "quarter", - "testing period", - "period" - ] - }, - "AcademicSession": { - "type": "object", - "description": "A named period of time that can be used to communicate the various schedules and time periods an institution recognizes and uses to organize their education. AcademicSessions can be nested.\nOfferings MAY be be linked to a specific AcademicSession to indicate that the specified Offering takes place during the AcademicSession, however this is not mandatory.\n", - "required": [ - "academicSessionId", - "name", - "startDate", - "endDate" - ], - "properties": { - "academicSessionId": { - "type": "string", - "description": "Unique id for this academic session", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - }, - "academicSessionType": { - "$ref": "#/components/schemas/academicSessionType" - }, - "primaryCode": { - "description": "The primary human readable identifier for this academic session. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "identifier", - "code": "2012-Q1" - } - }, - "name": { - "type": "array", - "description": "The name of this academic session", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Fall semester 2020" - } - ] - }, - "startDate": { - "type": "string", - "description": "The day on which this academic session starts, RFC3339 (full-date)", - "format": "date", - "example": "2020-08-17" - }, - "endDate": { - "type": "string", - "description": "The day on which this academic session ends, RFC3339 (full-date)", - "format": "date", - "example": "2020-12-18" - }, - "parent": { - "description": "The parent Academicsession of this session (e.g. fall semester 20xx where the current session is a week 40). This object is [`expandable`](#tag/academic_sessions_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - }, - "children": { - "type": "array", - "description": "The list of Academicsession children of this Session (e.g. all academic sessions in fall semester 20xx). This object is [`expandable`](#tag/academic_sessions_model)", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - } - }, - "year": { - "description": "The top level year of this session (e.g. 20xx where the current session is a week 40 of a semester). This object is [`expandable`](#tag/academic_sessions_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "Expanded AcademicSession" - } - ] - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "x-test-consumer", - "additional": "custom", - "attributes": "here" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "resultValueType": { - "type": "string", - "description": "The result value type for this offering", - "enum": [ - "pass-or-fail", - "US letter", - "UK letter", - "0-100", - "1-10" - ], - "example": "1-10" - }, - "OfferingProperties": { - "type": "object", - "description": "Either a program, course or component offering which descrbes the program, course or offering in time", - "required": [ - "primaryCode", - "offeringType", - "name", - "description", - "teachingLanguage", - "resultExpected" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for this offering. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "example": { - "codeType": "offeringCode", - "code": "INFOMQNM-20FS" - }, - "readOnly": true - }, - "offeringType": { - "type": "string", - "description": "The type of this offering", - "enum": [ - "program", - "course", - "component" - ], - "example": "component" - }, - "academicSession": { - "$ref": "#/components/schemas/AcademicSession" - }, - "name": { - "type": "array", - "description": "The name of this offering", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Final written test for INFOMQNM for fall semseter 2020" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation or internal code used to identify this offering", - "maxLength": 256, - "example": "Test-INFOMQNM-20FS" - }, - "description": { - "type": "array", - "description": "The description of this offering.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "'Prove in writing knowledge of research methods, including:\nAcquire knowledge of HCI research paradigms\nAble to design suitable research studies (e.g., choose between within and between subject designs)\nDefine/apply/design metrics and scales\nDefine/produce materials (e.g., stimuli and questionnaires)\nDefine protocols for research studies\nUnderstands and take in account concepts of reliability and validity\nAnalyze and improve methods and analysis of published scientific articles\nAble to deliver scientific reports\nProve in writing knowledge of ­­­statistics, including:\nHandle hypothesis testing with complex designs (e.g., including , dependent, independent, and co variates)\nData preparation (e.g., coding and feature selection)\nReason towards adequate techniques to ensure valid outcomes (e.g., be aware of type I, type II errors)\nSelect an appropriate sampling method (e.g., stratified)\nPerform parametric tests (e.g., repeated measures (M)ANOVA)\nPerform non-parametric tests (e.g., Chi-square, Mann-Whitney, and Kruskal-Wallis)'\n" - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this offering is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "maxNumberStudents": { - "type": "number", - "description": "The maximum number of students allowed to enroll for this offering", - "format": "int32", - "minimum": 0, - "example": 200 - }, - "enrolledNumberStudents": { - "type": "number", - "description": "The number of students that have already enrolled for this offering", - "format": "int32", - "minimum": 0, - "example": 150 - }, - "pendingNumberStudents": { - "type": "number", - "description": "The number of students that have a pending enrollment request for this offering", - "format": "int32", - "minimum": 0, - "example": 50 - }, - "minNumberStudents": { - "type": "number", - "description": "The minimum number of students needed for this offering to proceed", - "format": "int32", - "minimum": 0, - "example": 15 - }, - "resultExpected": { - "type": "boolean", - "description": "resultExpected, previously knwon as isLineItem is used so the specific instance of the object is identified as being an element that CAN contain “grade” information.\nOfferings do not always have to result in a grade or an other type of result. \nIf there is a result expected from a programOffering/courseOffering/componentOffering the is resultExpected field should parse true\n", - "example": true - }, - "resultValueType": { - "$ref": "#/components/schemas/resultValueType" - }, - "link": { - "type": "string", - "description": "URL of this offering's webpage.", - "format": "uri", - "maxLength": 2048, - "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM" - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "explanationRequiredPermission": "Toestemming is vereist omdat we daarom vragen.", - "requiredPermissionRegistration": "yes", - "registrationStatus": "open" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - }, - "Offering": { - "allOf": [ - { - "$ref": "#/components/schemas/OfferingId" - }, - { - "$ref": "#/components/schemas/OfferingProperties" - } - ] - }, - "costType": { - "type": "string", - "description": "The type of the cost. This is an *extensible enumeration*.\n\nThe following values have been defined in the specification:\n - `STAP eligible`: the costs that a student can get STAP subsidy for\n - `total costs`: the total costs that a student is to pay to follow this offering\n\nImplementations are allowed to add additional values to those above, as long as they do not overlap in definition to existing values.\n", - "example": "total costs", - "x-ooapi-extensible-enum": [ - "STAP eligible", - "total costs" - ] - }, - "Cost": { - "type": "object", - "required": [ - "costType" - ], - "properties": { - "costType": { - "$ref": "#/components/schemas/costType" - }, - "amount": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The total amount of the cost as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "340.84" - }, - "vatAmount": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The part of the cost that is VAT, as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "40" - }, - "amountWithoutVat": { - "type": "string", - "pattern": "^\\d+(?:\\.\\d+)?$", - "description": "The part of the cost that is non-VAT. as a string. Use a '.' (dot) as an optional separator. The numbers before the separator signify the major units of the currency, after the dot the minor units. Only a single separator is allowed. Do not use a comma.", - "example": "300.84" - }, - "currency": { - "type": "string", - "description": "The currency this cost is in. Should correspond to one of the currency codes from ISO 4217.", - "example": "EUR" - }, - "displayAmount": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "An array of optional pre-formatted strings in different locales. Clients can choose to use this string instead of rendering their own based on the current locale of the user.", - "example": [ - { - "language": "nl-NL", - "value": "€380,84" - }, - { - "language": "en-US", - "value": "$401.17" - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - }, - "additionalProperties": false - }, - "ProgramOfferingProperties": { - "type": "object", - "required": [ - "modeOfStudy", - "startDate", - "endDate" - ], - "properties": { - "startDate": { - "type": "string", - "description": "The moment on which this offering starts, RFC3339 (full-date)", - "format": "date", - "example": "2019-08-21" - }, - "endDate": { - "type": "string", - "description": "The moment on which this offering ends, RFC3339 (full-date)", - "format": "date", - "example": "2023-06-15" - }, - "enrollStartDate": { - "type": "string", - "description": "The first day on which a student can enroll for this program.", - "format": "date", - "example": "2019-05-01" - }, - "enrollEndDate": { - "type": "string", - "description": "The last day on which a student can enroll for this program.", - "format": "date", - "example": "2019-08-01" - }, - "flexibleEntryPeriodStart": { - "type": "string", - "description": "If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`.", - "format": "date" - }, - "flexibleEntryPeriodEnd": { - "type": "string", - "description": "If this is a program wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`.", - "format": "date" - }, - "addresses": { - "type": "array", - "description": "Addresses for this offering", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "priceInformation": { - "type": "array", - "description": "Price information for this offering.", - "items": { - "$ref": "#/components/schemas/Cost" - }, - "minItems": 1 - }, - "program": { - "description": "The Program that is offered in this programoffering. [`expandable`](#tag/program_model)\nBy default only the `programId` (a string) is returned. If the client requested an expansion of `program` the full program object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Program object" - } - ] - }, - "organization": { - "description": "The organization that manages this programeoffering. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "academicSession": { - "description": "The academicsession during which this programoffering takes place. [`expandable`](#tag/academic_session_model)\nBy default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "AcademicSession object" - } - ] - } - } - }, - "OfferingRioConsumer": { - "allOf": [ - { - "$ref": "#/components/schemas/Consumer" - }, - { - "required": [ - "registrationStatus", - "requiredPermissionRegistration" - ], - "properties": { - "explanationRequiredPermission": { - "type": "string", - "description": "toelichtingVereisteToestemming\nIs een tekstuele toelichting op de voor aanmelding vereiste toestemming van de onderwijsaanbieder\n" - }, - "requiredPermissionRegistration": { - "type": "string", - "description": "toestemmingVereistVoorAanmelding\nGeeft aan of een aspirant-student voor een bepaald cohort van een aangeboden opleiding toestemming van de onderwijsaanbieder nodig heeft om zich aan te mogen melden.\n- yes: JA\n- no: NEE\n", - "enum": [ - "yes", - "no" - ] - }, - "registrationStatus": { - "type": "string", - "description": "cohortStatus\nDe toegestane waarden voor de status van een cohort van een aangeboden opleiding. Hiermee kan bijvoorbeeld worden aangegeven of een bepaald cohort open staat voor aanmelding, of dat het gesloten is.\n", - "enum": [ - "open", - "closed" - ] - }, - "modeOfDelivery": { - "type": "string", - "description": "The value of consumers RIO modeOfDelivery will override the main object's modeOfDelivery when using the RIO mapper", - "enum": [ - "online", - "hybrid", - "situated", - "lecture", - "self-study", - "coaching" - ] - } - } - } - ] - }, - "ProgramOffering": { - "allOf": [ - { - "$ref": "#/components/schemas/Offering" - }, - { - "$ref": "#/components/schemas/ProgramOfferingProperties" - }, - { - "required": [ - "offeringId", - "primaryCode", - "offeringType", - "name", - "description", - "teachingLanguage", - "resultExpected", - "startDate", - "endDate", - "enrollStartDate" - ] - } - ], - "properties": { - "consumers": { - "contains": { - "$ref": "#/components/schemas/OfferingRioConsumer" - } - } - } - }, - "CourseId": { - "type": "object", - "description": "An object describing the metadata of a course", - "required": [ - "courseId" - ], - "properties": { - "courseId": { - "type": "string", - "description": "Unique id of this course", - "format": "uuid", - "example": "123e4567-e89b-12d3-a456-426614174000", - "readOnly": true - } - } - }, - "CourseProperties": { - "type": "object", - "description": "An object describing the metadata of a course", - "required": [ - "name", - "abbreviation", - "description", - "teachingLanguage", - "level", - "primaryCode" - ], - "properties": { - "primaryCode": { - "description": "The primary human readable identifier for this course. This is often the source identifier as defined by the institution.", - "$ref": "#/components/schemas/IdentifierEntry", - "readOnly": true - }, - "name": { - "type": "array", - "description": "The name of this course (ECTS-title)", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Academic and Professional Writing" - } - ] - }, - "abbreviation": { - "type": "string", - "description": "The abbreviation or internal code used to identify this course (ECTS-code)", - "maxLength": 256, - "example": "INFOMQNM" - }, - "studyLoad": { - "$ref": "#/components/schemas/StudyLoadDescriptor" - }, - "modeOfDelivery": { - "$ref": "#/components/schemas/modesOfDelivery" - }, - "duration": { - "type": "string", - "description": "The duration of this course. The duration format is from the ISO 8601 ABNF as given in Appendix A of RFC 3339.", - "pattern": "^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)([DW]))?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$", - "example": "P1DT30H4S" - }, - "firstStartDate": { - "type": "string", - "description": "The date when participants can follow this course for the first time.", - "format": "date" - }, - "description": { - "type": "array", - "description": "The description of this course (ECTS-description).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "As with all empirical sciences, to assure valid outcomes, HCI studies heavily rely on research methods and statistics. This holds for the design of user interfaces, personalized recommender systems, and interaction paradigms for the internet of things. This course prepares you to do so by learning you to collect data, design experiments, and analyze the results. By the end of the course, you will have a detailed understanding of how to select and apply quantitative research methods and analysis to address virtually all HCI challenges. Quantitative research and data analysis will be taught in the context of state-of-the-art HCI challenges. Lectures will be alternated with hands-on learning, including work with predefined datasets (e.g., addressing facial features, cognitive load, and emotion). Additionally, students will set up their own research (e.g., using eye tracking). Data processing and analysis will be executed using R." - } - ] - }, - "teachingLanguage": { - "type": "string", - "description": "The (primary) teaching language in which this course is given, should be a three-letter language code as specified by ISO 639-2.", - "minLength": 3, - "maxLength": 3, - "pattern": "^[a-z]{3}$", - "example": "nld" - }, - "fieldsOfStudy": { - "type": "string", - "description": "Field(s) of study (e.g. ISCED-F) (http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf.", - "maxLength": 4, - "example": "0732" - }, - "learningOutcomes": { - "type": "array", - "description": "Statements that describe the knowledge or skills students should acquire by the end of a particular course (ECTS-learningoutcome).", - "items": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Executable knowledge of research methods, including: Acquire knowledge of HCI research paradigms." - } - ] - } - }, - "admissionRequirements": { - "type": "array", - "description": "This information may be given at an institutional level and/or at the level of individual programmes. Make sure that it is clear whether the information applies to fee-paying students (national and/or international) or to exchange students.", - "example": [ - { - "language": "en-GB", - "value": "Students need to be enrolled at qualifying institutions of higher education that participate in this alliance" - } - ], - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "qualificationRequirements": { - "type": "array", - "description": "Normally, students will receive a diploma when they have completed the (official) study program and have obtained the required number of credits. If there are any other specific requirements that students need to have fulfilled, mention them here.", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - } - }, - "level": { - "$ref": "#/components/schemas/level" - }, - "enrollment": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "description": "The extra information that is provided for enrollment", - "example": [ - { - "language": "en-GB", - "value": "enrollment through SIS. [The limited implementation of Git Hub Markdown syntax](#tag/formatting-and-displaying-results-from-API) MAY be used for rich text representation." - } - ] - }, - "resources": { - "type": "array", - "description": "An overview of the literature and other resources that is used in this course (ECTS-recommended reading and other sources)", - "items": { - "type": "string" - }, - "example": [ - "book to be announced", - "on-line resource x" - ] - }, - "assessment": { - "type": "array", - "description": "A description of the way exams for this course are taken (ECTS-assessment method and criteria).", - "minItems": 1, - "items": { - "$ref": "#/components/schemas/LanguageTypedString" - }, - "example": [ - { - "language": "en-GB", - "value": "Exam on campus" - } - ] - }, - "link": { - "type": "string", - "description": "URL of the course's website", - "format": "uri", - "maxLength": 2048, - "example": "https://osiris.uu.nl/osiris_student_uuprd/OnderwijsCatalogusZoekCursus.do#submitForm?cursuscode=INFOMQNM" - }, - "educationSpecification": { - "description": "The educationSpecification of which this course is a more concrete implementation. [`expandable`](#tag/education_specification_model)", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "educationSpecificationId" - }, - { - "$ref": "#/components/schemas/EducationSpecification", - "title": "EducationSpecification" - } - ] - }, - "addresses": { - "type": "array", - "description": "Addresses for this course", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "otherCodes": { - "type": "array", - "description": "An array of additional human readable codes/identifiers for the entity being described.", - "items": { - "$ref": "#/components/schemas/IdentifierEntry" - } - }, - "consumers": { - "description": "The additional consumer elements that can be provided, see the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Consumer" - }, - "example": [ - { - "consumerKey": "rio", - "educationOffererCode": "123A321", - "educationLocationCode": "334X123", - "consentParticipationSTAP": "permission_granted", - "jointPartnerCodes": [ - "123A123" - ], - "foreignPartners": [ - "Harvard University" - ] - } - ] - }, - "ext": { - "$ref": "#/components/schemas/Ext" - }, - "programs": { - "description": "The program of which this course is a part of. This object is [`expandable`](#tag/program_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programId" - }, - { - "$ref": "#/components/schemas/Program", - "title": "Program object" - } - ] - } - }, - "coordinators": { - "description": "The person(s) responsible for this course. This object is [`expandable`](#tag/person_model)", - "type": "array", - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "personId" - }, - { - "$ref": "#/components/schemas/Person", - "title": "Person object" - } - ] - } - }, - "organization": { - "description": "The organization that manages this group. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - } - } - }, - "Course": { - "allOf": [ - { - "$ref": "#/components/schemas/CourseId" - }, - { - "$ref": "#/components/schemas/CourseProperties" - }, - { - "properties": { - "validFrom": { - "description": "The first day this course is valid (inclusive).", - "type": "string", - "format": "date" - }, - "validTo": { - "description": "The day this course ceases to be valid (e.g. exclusive).", - "type": "string", - "format": "date" - } - } - } - ] - }, - "TimelineOverrideCourse": { - "type": "object", - "required": [ - "validFrom", - "course" - ], - "description": "A timeline override of the course.", - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "course": { - "$ref": "#/components/schemas/CourseProperties" - } - } - }, - "CourseRioConsumer": { - "allOf": [ - { - "$ref": "#/components/schemas/Consumer" - }, - { - "required": [ - "educationOffererCode", - "consentParticipationSTAP" - ], - "properties": { - "consumerKey": { - "const": "rio" - }, - "educationOffererCode": { - "type": "string", - "description": "onderwijsaanbiedercode\nEen betekenisloze identifier voor een onderwijsaanbieder in de Registratie Instellingen en Opleidingen.\n", - "pattern": "^(?:\\d{3}A\\d{3})$" - }, - "educationLocationCode": { - "type": "string", - "description": "onderwijslocatiecode\nEen betekenisloze identifier voor een onderwijslocatie in de Registratie Instellingen en Opleidingen.\n", - "pattern": "^(?:\\d{3}X\\d{3})$" - }, - "consentParticipationSTAP": { - "type": "string", - "description": "toestemmingDeelnameSTAP\nGeeft aan of een AangebodenOpleiding beschikbaar is in het kader van de STAP-regeling en voorkomt in het Scholingsregister.\n", - "enum": [ - "permission_granted", - "permission_not_granted" - ] - }, - "jointPartnerCodes": { - "type": "array", - "items": { - "type": "string", - "pattern": "^(?:\\d{3}A\\d{3})$" - }, - "minItems": 1, - "description": "samenwerkendeOnderwijsaanbiedercode\nCode van de onderwijsaanbieder waarmee wordt samengewerkt OnderwijsaanbiederID-v01\n" - }, - "foreignPartners": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1, - "description": "buitenlandsePartner\nBeschrijving van de organisatie waarmee door een Nederlandse onderwijsbestuur wordt samengewerkt\nbij het verzorgen van een Joint Degree.\n" - }, - "deficiency": { - "type": "string", - "description": "deficientie Geeft aan of inschrijving met onvoldoende vooropleiding mogelijk is\n- deficiencies: DEFICIENTIES\t\t\tInschrijving mogelijk met onvoldoende vooropleiding\n- no_dediciencies: GEEN_DEFICIENTIES\t\t\tInschrijving alleen mogelijk met voldoende vooropleiding\n", - "enum": [ - "deficiencies", - "no_deficiencies" - ] - }, - "requirementsActivities": { - "type": "string", - "description": "eisenWerkzaamheden\nGeeft aan of er eisen zijn gesteld aan het type werkzaamheden die verricht worden in het kader van de opleiding.\n- requirements: EISEN\t\t\tEr zijn eisen gesteld aan de werkzaamheden in het kader van de opleiding\n- no_requirements: GEEN_EISEN\t\t\tEr zijn geen eisen gesteld aan de werkzaamheden in het kader van de opleiding\n", - "enum": [ - "requirements", - "no_requirements" - ] - }, - "propaedeuticPhase": { - "type": "string", - "description": "propadeutischeFase\nGeeft aan of de aangeboden opleiding een propedeutische fase kent en of deze wordt afgesloten met een propedeutisch examen.\n- no_propaedeutic_phase: GEEN_PROPEDEUTISCHE_FASE\t\t\tGeen propedeutische fase\n- propaedeutic_phase_exam: PROPEDEUTISCHE_FASE_EXAMEN\t\t\tPropedeutische fase met examen\n- propaedeutic_phase_no_exam: PROPEDEUTISCHE_FASE_ZONDER_EXAMEN\t\t\tPropedeutische fase zonder examen\n", - "enum": [ - "no_propaedeutic_phase", - "propaedeutic_phase_exam", - "propaedeutic_phase_no_exam" - ] - }, - "studyChoiceCheck": { - "type": "string", - "description": "studiekeuzecheck\nSpecificeert of er en zo ja hoe een controle op geschiktheid van een aankomend student voor deelname aan gekozen studie plaatsvindt.\n- no_study_choice_check: GEEN_STUDIEKEUZE_CHECK\t\t\tGeen studiekeuzecheck\n- study_choice_check_available: STUDIEKEUZE_CHECK_VAN_TOEPASSING\t\t\tStudiekeuzecheck van toepassing\n- study_choice_check_mandatory: STUDIEKEUZE_CHECK_VERPLICHT\t\t\tStudiekeuzecheck verplicht\n", - "enum": [ - "no_study_choice_check", - "study_choice_check_available", - "study_choice_check_mandatory" - ] - }, - "acceleratedRoute": { - "type": "string", - "description": "versneldTraject\nGeeft aan of een student een versneld programma volgt zodat het opleiding in minder tijd dan normaal doorlopen kan worden.\n- accelerated_route: VERSNELD_TRAJECT\t\t\tVersneld traject\n- no_accelerated_route: GEEN_VERSNELD_TRAJECT\t\t\tGeen versneld traject\n", - "enum": [ - "accelerated_route", - "no_accelerated_route" - ] - } - } - } - ] - }, - "CourseExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/Course" - }, - { - "type": "object", - "description": "These properties are only present when explicitly included", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideCourse" - } - } - } - } - ], - "required": [ - "courseId", - "name", - "abbreviation", - "description", - "primaryCode", - "level", - "teachingLanguage", - "validFrom", - "educationSpecification", - "duration" - ], - "properties": { - "consumers": { - "contains": { - "$ref": "#/components/schemas/CourseRioConsumer" - } - } - } - }, - "CourseOfferingProperties": { - "type": "object", - "required": [ - "startDate", - "endDate" - ], - "properties": { - "startDate": { - "type": "string", - "description": "The moment on which this offering starts, RFC3339 (full-date)", - "format": "date", - "example": "2019-08-21" - }, - "endDate": { - "type": "string", - "description": "The moment on which this offering ends, RFC3339 (full-date)", - "format": "date", - "example": "2019-10-23" - }, - "enrollStartDate": { - "type": "string", - "description": "The first day on which a student can enroll for this course.", - "format": "date", - "example": "2019-05-01" - }, - "enrollEndDate": { - "type": "string", - "description": "The last day on which a student can enroll for this course.", - "format": "date", - "example": "2019-08-01" - }, - "flexibleEntryPeriodStart": { - "type": "string", - "description": "If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodEnd`.", - "format": "date" - }, - "flexibleEntryPeriodEnd": { - "type": "string", - "description": "If this is a course wherein participants can start at various moments, without missing anything, use this attribute in combination with `flexibleEntryPeriodStart`.", - "format": "date" - }, - "addresses": { - "type": "array", - "description": "Addresses for this offering", - "items": { - "$ref": "#/components/schemas/Address" - } - }, - "priceInformation": { - "type": "array", - "description": "Price information for this offering.", - "items": { - "$ref": "#/components/schemas/Cost" - } - }, - "course": { - "description": "The course that is offered in this courseoffering. [`expandable`](#tag/course_model)\nBy default only the `courseId` (a string) is returned. If the client requested an expansion of `course` the full course object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "courseId" - }, - { - "$ref": "#/components/schemas/Course", - "title": "Course object" - } - ] - }, - "programOffering": { - "description": "The programoffering where this courseoffering is related to. [`expandable`](#tag/program_offering_model)\nBy default only the `programOfferingId` (a string) is returned. If the client requested an expansion of `programOffering` the full programOffering object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "programOfferingId" - }, - { - "$ref": "#/components/schemas/ProgramOffering", - "title": "ProgramOffering object" - } - ] - }, - "organization": { - "description": "The organization that manages this courseoffering. [`expandable`](#tag/organization_model)\nBy default only the `organizationId` (a string) is returned. If the client requested an expansion of `organization` the full organization object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "organizationId" - }, - { - "$ref": "#/components/schemas/Organization", - "title": "Organization object" - } - ] - }, - "academicSession": { - "description": "The academicsession during which this courseoffering takes place. [`expandable`](#tag/academic_session_model)\nBy default only the `academicSessionId` (a string) is returned. If the client requested an expansion of `academicSession` the full academicsession object should be returned.\n", - "oneOf": [ - { - "$ref": "#/components/schemas/Identifier", - "title": "academicSessionId" - }, - { - "$ref": "#/components/schemas/AcademicSession", - "title": "AcademicSession object" - } - ] - } - } - }, - "CourseOffering": { - "allOf": [ - { - "$ref": "#/components/schemas/Offering" - }, - { - "$ref": "#/components/schemas/CourseOfferingProperties" - }, - { - "required": [ - "offeringId", - "primaryCode", - "offeringType", - "name", - "description", - "teachingLanguage", - "resultExpected", - "startDate", - "endDate", - "enrollStartDate" - ] - } - ] - }, - "TimelineOverrideEducationSpecification": { - "type": "object", - "description": "A timeline override of the EducationSpecification.", - "required": [ - "validFrom", - "educationSpecification" - ], - "properties": { - "validFrom": { - "type": "string", - "description": "The day on which this timelineOverride starts (inclusive), RFC3339 (date)", - "format": "date", - "example": "2021-09-01" - }, - "validTo": { - "type": "string", - "description": "The day on which this timelineOverride ends (exclusive), RFC3339 (date)", - "format": "date", - "example": "2022-08-31" - }, - "educationSpecification": { - "$ref": "#/components/schemas/EducationSpecificationProperties" - } - } - }, - "HoOpleidingProperties": { - "required": [ - "primaryCode", - "educationSpecificationType", - "name", - "validFrom", - "formalDocument", - "level", - "sector" - ], - "properties": { - "educationSpecificationType": { - "const": "program" - } - } - }, - "HOECProperties": { - "required": [ - "primaryCode", - "educationSpecificationType", - "name", - "validFrom" - ], - "properties": { - "educationSpecificationType": { - "const": "cluster" - } - } - }, - "HoOnderwijsEenheidProperties": { - "required": [ - "primaryCode", - "educationSpecificationType", - "name", - "validFrom" - ], - "properties": { - "educationSpecificationType": { - "const": "course" - } - } - }, - "HoParticuliereOpleidingProperties": { - "required": [ - "primaryCode", - "educationSpecificationType", - "name", - "validFrom" - ], - "properties": { - "educationSpecificationType": { - "const": "privateProgram" - } - } - }, - "EducationSpecificationRioConsumer": { - "allOf": [ - { - "$ref": "#/components/schemas/Consumer" - }, - { - "properties": { - "consumerKey": { - "const": "rio" - }, - "educationSpecificationSubType": { - "type": "string", - "enum": [ - "variant", - "cluster" - ] - }, - "category": { - "type": "array", - "description": "A classification for programs in non-formal education. Used when describing EducationSpecification's that will map to a `articuliereOpleiding in RIO\n", - "minItems": 0, - "maxItems": 3, - "items": { - "type": "string", - "enum": [ - "business_and_project_support", - "economy", - "behavior_and_society", - "healthcare_and_sport", - "hobby_and_leisure_time", - "agriculture_food_and_natural_environment", - "management_and_project_management", - "nature", - "education", - "law", - "cross_sectoral", - "language_and_culture", - "technology_and_ict", - "tourism_hospitality_and_recreation", - "transport_and_logistics", - "security_and_defense" - ] - } - } - } - } - ] - }, - "EducationSpecificationExpanded": { - "allOf": [ - { - "$ref": "#/components/schemas/EducationSpecification" - }, - { - "type": "object", - "title": "With timelineOverrides", - "properties": { - "timelineOverrides": { - "description": "Timeline overrides allow an implementation to provide versions of entities that will be valid in the future or have been in the past.", - "type": "array", - "items": { - "$ref": "#/components/schemas/TimelineOverrideEducationSpecification" - } - } - } - } - ], - "oneOf": [ - { - "$ref": "#/components/schemas/HoOpleidingProperties" - }, - { - "$ref": "#/components/schemas/HOECProperties" - }, - { - "$ref": "#/components/schemas/HoOnderwijsEenheidProperties" - }, - { - "$ref": "#/components/schemas/HoParticuliereOpleidingProperties" - } - ], - "properties": { - "consumers": { - "contains": { - "$ref": "#/components/schemas/EducationSpecificationRioConsumer" - } - } - } - } - }, - "responses": { - "ErrorBadRequest": { - "description": "Bad request", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorUnauthorized": { - "description": "Unauthorized", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorForbidden": { - "description": "Forbidden", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorNotFound": { - "description": "Not Found", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorMethodNotAllowed": { - "description": "Method not allowed", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorTooManyRequests": { - "description": "Too many requests", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - }, - "ErrorInternalServerError": { - "description": "Internal Server Error", - "content": { - "application/problem+json": { - "schema": { - "$ref": "#/components/schemas/Problem" - } - } - } - } - }, - "parameters": { - "primaryCode": { - "name": "primaryCode", - "in": "query", - "description": "The primaryCode of the requested item. This is often the source identifier as defined by the institution.", - "required": false, - "schema": { - "type": "string" - } - }, - "pageSize": { - "name": "pageSize", - "in": "query", - "description": "The number of items per page", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 10, - "enum": [ - 10, - 20, - 50, - 100, - 250 - ] - } - }, - "pageNumber": { - "name": "pageNumber", - "in": "query", - "description": "The page number to get. Page numbers start at 1.", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "example": 1, - "minimum": 1 - } - }, - "consumer": { - "name": "consumer", - "in": "query", - "description": "Request entities meant for a specific consumer. This query parameter is independent from the `consumers` attribute. See the [documentation on support for specific consumers](https://open-education-api.github.io/specification/#/consumers) for more information about this mechanism.", - "required": false, - "schema": { - "type": "string" - } - }, - "search": { - "name": "q", - "in": "query", - "description": "Filter by items having a name, abbreviation or description containing the given search term (exact partial match, case insensitive)", - "required": false, - "schema": { - "type": "string" - } - }, - "teachingLanguage": { - "name": "teachingLanguage", - "in": "query", - "description": "Filter by teachingLanguage, which is a string describing the main teaching language, should be a three-letter language code as specified by ISO 639-2.", - "required": false, - "schema": { - "type": "string", - "pattern": "^[a-z]{3}$", - "minLength": 3, - "maxLength": 3 - }, - "example": "nld" - }, - "returnTimelineOverrides": { - "name": "returnTimelineOverrides", - "in": "query", - "description": "Controls whether the attribute `timelineOverrides` is returned or not. The default is `false`, so this has to explicitly set to `true` if a client needs the timeline overrides. See [GET /education-specifications/{educationSpecificationId}](#tag/education-specifications/paths/~1education-specifications~1{educationSpecificationId}/get) for an example.", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - } - } - }, - "paths": { - "/": { - "get": { - "parameters": [], - "summary": "GET /", - "description": "Get metadata for the service.", - "tags": [ - "service metadata" - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Service" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs": { - "get": { - "summary": "GET /programs", - "description": "Get an ordered list of all programs, ordered by name.", - "tags": [ - "programs" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "programType", - "in": "query", - "description": "Filter by program type", - "required": false, - "schema": { - "$ref": "#/components/schemas/programType" - } - }, - { - "name": "qualificationAwarded", - "in": "query", - "description": "Filter by qualificationAwarded", - "required": false, - "schema": { - "$ref": "#/components/schemas/qualificationAwarded" - } - }, - { - "name": "levelOfQualification", - "in": "query", - "description": "Filter by levelOfQualification", - "required": false, - "schema": { - "$ref": "#/components/schemas/levelOfQualification" - } - }, - { - "name": "sector", - "in": "query", - "description": "Filter by sector", - "required": false, - "schema": { - "$ref": "#/components/schemas/sector" - } - }, - { - "name": "fieldsOfStudy", - "in": "query", - "description": "Filter by fieldsOfStudy", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programId", - "name", - "-programId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "programId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProgramExpanded" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}": { - "get": { - "summary": "GET /programs/{programId}", - "description": "Get a single program.", - "tags": [ - "programs" - ], - "parameters": [ - { - "name": "programId", - "in": "path", - "description": "Program ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "explode": false, - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children", - "coordinators", - "organization", - "educationSpecification" - ] - } - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProgramExpanded" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/programs/{programId}/offerings": { - "get": { - "summary": "GET /programs/{programId}/offerings", - "description": "Get a list of all offerings for this program, ordered chronologically.", - "tags": [ - "programs" - ], - "parameters": [ - { - "name": "programId", - "in": "path", - "description": "Program ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "modeOfStudy", - "in": "query", - "description": "Filter by modeOfStudy", - "required": false, - "schema": { - "$ref": "#/components/schemas/modeOfStudy" - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "name", - "-startDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProgramOffering" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses": { - "get": { - "summary": "GET /courses", - "description": "Get a list of all courses, ordered by name (ascending).", - "tags": [ - "courses" - ], - "parameters": [ - { - "$ref": "#/components/parameters/primaryCode" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "level", - "in": "query", - "description": "Filter by level", - "required": false, - "schema": { - "$ref": "#/components/schemas/level" - } - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "courseId", - "name", - "-courseId", - "-name" - ] - }, - "default": [ - "name" - ], - "example": [ - "name", - "-courseId" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CourseExpanded" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses/{courseId}": { - "get": { - "summary": "GET /courses/{courseId}", - "description": "Get a single course.", - "tags": [ - "courses" - ], - "parameters": [ - { - "name": "courseId", - "in": "path", - "description": "Course ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "expand", - "in": "query", - "explode": false, - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "programs", - "coordinators", - "organization", - "educationSpecification" - ] - } - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CourseExpanded" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/courses/{courseId}/offerings": { - "get": { - "summary": "GET /courses/{courseId}/offerings", - "description": "Get a list of all offerings for this course, ordered chronologically.", - "tags": [ - "courses" - ], - "parameters": [ - { - "name": "courseId", - "in": "path", - "description": "Course ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "$ref": "#/components/parameters/teachingLanguage" - }, - { - "name": "modeOfDelivery", - "in": "query", - "description": "Filter by modeOfDelivery", - "required": false, - "schema": { - "$ref": "#/components/schemas/modesOfDelivery" - } - }, - { - "name": "resultExpected", - "in": "query", - "description": "Filter by resultExpected", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "since", - "in": "query", - "description": "Filter all offerings by providing a minimum start date for the corresponding academic session, RFC3339 (full-date). By default only future offerings are shown (equal to `?since=`).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "until", - "in": "query", - "description": "Filter all offerings by providing a maximum end date for the corresponding academic session, RFC3339 (full-date).", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "offeringId", - "name", - "startDate", - "endDate", - "-offeringId", - "-name", - "-startDate", - "-endDate" - ] - }, - "default": [ - "startDate" - ], - "example": [ - "offeringId", - "-endDate" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CourseOffering" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications": { - "get": { - "summary": "GET /education-specifications", - "description": "Get a list of all education specifications, ordered by name (ascending).", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "$ref": "#/components/parameters/pageSize" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/consumer" - }, - { - "$ref": "#/components/parameters/search" - }, - { - "name": "educationSpecificationType", - "in": "query", - "description": "Filter by type of education specification", - "required": false, - "schema": { - "$ref": "#/components/schemas/educationSpecificationType" - } - }, - { - "name": "primaryCode", - "in": "query", - "description": "Filter by primary code of education specification", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "explode": false, - "description": "Sort by one or more attributes, the default is ascending. Prefixing the attribute with a minus sign `-` allows for descending sort. Examples: [ATTR | -ATTR | ATTR1,-ATTR2]", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "educationSpecificationType", - "name", - "primaryCode", - "-educationSpecificationType", - "-name", - "-primaryCode" - ] - }, - "default": [ - [ - "name" - ] - ], - "example": [ - "educationSpecificationType", - "-primaryCode" - ] - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/Pagination" - }, - { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EducationSpecificationExpanded" - } - }, - "ext": { - "$ref": "#/components/schemas/Ext" - } - } - } - ] - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - }, - "/education-specifications/{educationSpecificationId}": { - "get": { - "summary": "GET /education-specifications/{educationSpecificationId}", - "description": "Get a single education specification.", - "tags": [ - "education specifications" - ], - "parameters": [ - { - "name": "educationSpecificationId", - "in": "path", - "description": "Education specification ID", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "$ref": "#/components/parameters/returnTimelineOverrides" - }, - { - "name": "expand", - "in": "query", - "explode": false, - "description": "Optional properties to include, separated by a comma", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "parent", - "children", - "organization" - ] - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EducationSpecificationExpanded" - } - } - } - }, - "400": { - "$ref": "#/components/responses/ErrorBadRequest" - }, - "401": { - "$ref": "#/components/responses/ErrorUnauthorized" - }, - "403": { - "$ref": "#/components/responses/ErrorForbidden" - }, - "404": { - "$ref": "#/components/responses/ErrorNotFound" - }, - "405": { - "$ref": "#/components/responses/ErrorMethodNotAllowed" - }, - "429": { - "$ref": "#/components/responses/ErrorTooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ErrorInternalServerError" - } - } - } - } - } -} diff --git a/src/nl/jomco/eduhub_validator/included_profiles.clj b/src/nl/jomco/apie/included_profiles.clj similarity index 83% rename from src/nl/jomco/eduhub_validator/included_profiles.clj rename to src/nl/jomco/apie/included_profiles.clj index c47884e..7debb9e 100644 --- a/src/nl/jomco/eduhub_validator/included_profiles.clj +++ b/src/nl/jomco/apie/included_profiles.clj @@ -1,4 +1,4 @@ -(ns nl.jomco.eduhub-validator.included-profiles +(ns nl.jomco.apie.included-profiles "Include configuration for specific profiles in the jar/binary" (:require [clojure.java.io :as io])) diff --git a/src/nl/jomco/eduhub_validator/main.clj b/src/nl/jomco/apie/main.clj similarity index 95% rename from src/nl/jomco/eduhub_validator/main.clj rename to src/nl/jomco/apie/main.clj index ab02251..963da84 100644 --- a/src/nl/jomco/eduhub_validator/main.clj +++ b/src/nl/jomco/apie/main.clj @@ -1,13 +1,13 @@ -(ns nl.jomco.eduhub-validator.main +(ns nl.jomco.apie.main (:require [clojure.data.json :as data.json] [clojure.edn :as edn] [clojure.java.io :as io] [clojure.pprint :as pprint] [clojure.string :as string] [clojure.tools.cli :refer [parse-opts]] - [nl.jomco.eduhub-validator.included-profiles :as included-profiles] - [nl.jomco.eduhub-validator.report :as report] - [nl.jomco.eduhub-validator.spider :as spider] + [nl.jomco.apie.included-profiles :as included-profiles] + [nl.jomco.apie.report :as report] + [nl.jomco.apie.spider :as spider] [ring.util.codec :as codec])) (defn- parse-header diff --git a/src/nl/jomco/eduhub_validator/report.clj b/src/nl/jomco/apie/report.clj similarity index 99% rename from src/nl/jomco/eduhub_validator/report.clj rename to src/nl/jomco/apie/report.clj index 9793c63..f36eedb 100644 --- a/src/nl/jomco/eduhub_validator/report.clj +++ b/src/nl/jomco/apie/report.clj @@ -1,9 +1,9 @@ -(ns nl.jomco.eduhub-validator.report +(ns nl.jomco.apie.report (:require [clojure.string :as string] [clojure.java.io :as io] [hiccup.page] [hiccup.util] - [nl.jomco.eduhub-validator.report.json :as json] + [nl.jomco.apie.report.json :as json] [nl.jomco.openapi.v3.example :as example])) (def max-issues-per-schema-path 10) diff --git a/src/nl/jomco/eduhub_validator/report/json.clj b/src/nl/jomco/apie/report/json.clj similarity index 97% rename from src/nl/jomco/eduhub_validator/report/json.clj rename to src/nl/jomco/apie/report/json.clj index 2328cfa..d2c8d94 100644 --- a/src/nl/jomco/eduhub_validator/report/json.clj +++ b/src/nl/jomco/apie/report/json.clj @@ -1,4 +1,4 @@ -(ns nl.jomco.eduhub-validator.report.json +(ns nl.jomco.apie.report.json (:require [clojure.data.json :as json] [clojure.string :as string])) diff --git a/src/nl/jomco/eduhub_validator/spider.clj b/src/nl/jomco/apie/spider.clj similarity index 99% rename from src/nl/jomco/eduhub_validator/spider.clj rename to src/nl/jomco/apie/spider.clj index aec5cd7..fc9e968 100644 --- a/src/nl/jomco/eduhub_validator/spider.clj +++ b/src/nl/jomco/apie/spider.clj @@ -1,4 +1,4 @@ -(ns nl.jomco.eduhub-validator.spider +(ns nl.jomco.apie.spider (:require [nl.jomco.openapi.v3.path-matcher :refer [paths-matcher]] [nl.jomco.openapi.v3.validator :as validator] [nl.jomco.spider :as spider] diff --git a/test/nl/jomco/eduhub_validator/report/json_test.clj b/test/nl/jomco/apie/report/json_test.clj similarity index 86% rename from test/nl/jomco/eduhub_validator/report/json_test.clj rename to test/nl/jomco/apie/report/json_test.clj index f20f121..1d90adf 100644 --- a/test/nl/jomco/eduhub_validator/report/json_test.clj +++ b/test/nl/jomco/apie/report/json_test.clj @@ -1,6 +1,6 @@ -(ns nl.jomco.eduhub-validator.report.json-test +(ns nl.jomco.apie.report.json-test (:require [clojure.test :refer [deftest is]] - [nl.jomco.eduhub-validator.report.json :as sut])) + [nl.jomco.apie.report.json :as sut])) (deftest to-s (is (= "1" (sut/to-s 1))) diff --git a/validate b/validate index a7a18ec..09e9f8d 100755 --- a/validate +++ b/validate @@ -6,4 +6,4 @@ else RUNTIME="clojure -M" fi -${RUNTIME} -m nl.jomco.eduhub-validator.main "$@" +${RUNTIME} -m nl.jomco.apie.main "$@" diff --git a/validate.bat b/validate.bat index 84eec1b..70230d9 100644 --- a/validate.bat +++ b/validate.bat @@ -6,4 +6,4 @@ if ERRORLEVEL 0 ( ) else ( set RUNTIME="clojure -M" ) -%RUNTIME% -m nl.jomco.eduhub-validator.main %* +%RUNTIME% -m nl.jomco.apie.main %* From 30aeb71b65221ecd29c5ba3fea95830dc01ccb31 Mon Sep 17 00:00:00 2001 From: Joost Diepenmaat Date: Wed, 22 Nov 2023 15:17:21 +0100 Subject: [PATCH 2/4] Some more rules for the petstore example --- README.md | 3 +- docs/example-report.html | 256 ++++++++++++++++++++++++++++++++++ example-profiles/petstore.edn | 33 ++++- 3 files changed, 287 insertions(+), 5 deletions(-) create mode 100644 docs/example-report.html diff --git a/README.md b/README.md index 99f12ac..6b758b7 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,8 @@ apie --profile example-profiles/petstore.edn \ This will spider the paths in the profile, validate against the included openapi specification and write a report to `report.html` -which can be opened using any web browser. +which can be opened using any web browser. See the [petstore example +report](https://surfnet.github.io/apie/example-report.html). The intermediate validation results are written to `observations.edn`. This file is in [EDN diff --git a/docs/example-report.html b/docs/example-report.html new file mode 100644 index 0000000..ce598a5 --- /dev/null +++ b/docs/example-report.html @@ -0,0 +1,256 @@ + +Validation report for https://petstore3.swagger.io/api/v3

Validation report for https://petstore3.swagger.io/api/v3

Summary

Run time
From Wed Nov 22 15:15:49 CET 2023 till Wed Nov 22 15:15:51 CET 2023

KPIs

Observations
13
Faultless observations
✅ 8 observations have no issues!
Validation score
😢 38.5% (5) observations have issues.

Results per request path

(sorted by percentage of issues)

/store/inventory

0 of 1 observations have no issues.

1 validation issue (by schema path):

  1. 1
    paths//store/inventory/get/responses
    1 issues in 1 observations
    • GET /store/inventory
      Status error; expected one of: 200, got 500 at response / status
      Value
      500
      Path in body
      response / status
      Full schema path
      paths / /store/inventory / get
      Issue data
      {
      +  "hints": {
      +    "ranges": [
      +      "200"
      +    ]
      +  },
      +  "issue": "status-error"
      +}

/store/order/{orderId}

0 of 3 observations have no issues.

1 validation issue (by schema path):

  1. 3
    paths//store/order/{orderId}/delete/responses
    3 issues in 3 observations
    • DELETE /store/order/31
      Status error; expected one of: 400, 404, got 200 at response / status
      Value
      200
      Path in body
      response / status
      Full schema path
      paths / /store/order/{orderId} / delete
      Issue data
      {
      +  "hints": {
      +    "ranges": [
      +      "400",
      +      "404"
      +    ]
      +  },
      +  "issue": "status-error"
      +}
    • DELETE /store/order/102
      Status error; expected one of: 400, 404, got 200 at response / status
      Value
      200
      Path in body
      response / status
      Full schema path
      paths / /store/order/{orderId} / delete
      Issue data
      {
      +  "hints": {
      +    "ranges": [
      +      "400",
      +      "404"
      +    ]
      +  },
      +  "issue": "status-error"
      +}
    • DELETE /store/order/21
      Status error; expected one of: 400, 404, got 200 at response / status
      Value
      200
      Path in body
      response / status
      Full schema path
      paths / /store/order/{orderId} / delete
      Issue data
      {
      +  "hints": {
      +    "ranges": [
      +      "400",
      +      "404"
      +    ]
      +  },
      +  "issue": "status-error"
      +}

/pet/findByStatus

2 of 3 observations have no issues.

1 validation issue (by schema path):

  1. 2
    components/schemas/Pet/properties/photoUrls/items/type
    2 issues in 1 observations
    • GET /pet/findByStatus
      Expected type string, got null at response / body / 10 / photoUrls / 0
      Value
      null
      Example from schema
      "example string"
      Path in body
      response / body / 10 / photoUrls / 0
      Full schema path
      paths / /pet/findByStatus / get / responses / 200 / content / application/json / schema / items / properties / photoUrls / items / type
      Issue data
      {
      +  "schema": {
      +    "type": "string"
      +  },
      +  "issue": "schema-validation-error"
      +}
    • GET /pet/findByStatus
      Expected type string, got null at response / body / 11 / photoUrls / 0
      Value
      null
      Example from schema
      "example string"
      Path in body
      response / body / 11 / photoUrls / 0
      Full schema path
      paths / /pet/findByStatus / get / responses / 200 / content / application/json / schema / items / properties / photoUrls / items / type
      Issue data
      {
      +  "schema": {
      +    "type": "string"
      +  },
      +  "issue": "schema-validation-error"
      +}

/pet/{petId}

3 of 3 observations have no issues.

/store/order

3 of 3 observations have no issues.
This report was generated at Wed Nov 22 15:15:51 CET 2023
diff --git a/example-profiles/petstore.edn b/example-profiles/petstore.edn index 02ce848..1eea94a 100644 --- a/example-profiles/petstore.edn +++ b/example-profiles/petstore.edn @@ -11,10 +11,35 @@ :query-params {"status" "sold"}} {:method "get" :path "/store/inventory"}] - :rules - [{:match [[:request :method, "get"] + :rules + [;; if a pet is found in lists, it should also have its own resource + ;; url + {:match [[:request :method, "get"] [:request :path "/pet/findByStatus"] [:response :status 200] [:response :body ?i "id" ?petId]] - :generates [{:method "get" - :path "/pet/{ ?petId }"}]}]} + :generates [ + {:method "get" + :path "/pet/{ ?petId }"}]} + + ;; if a pet is avalailable, order it + {:match [[:request :method, "get"] + [:request :path "/pet/findByStatus"] + [:response :status 200] + [:response :body ?i "id" ?petId] + [:response :body ?i "status" "available"]] + :generates [ + {:method "post" + :path "/store/order" + :headers {"content-type" "application/json"} + :body {:id (inc ?petId) + :petId ?petId + :quantity 1 + :shipDate "2023-10-10"}}]} + + ;; if we generated an order, delete it after + {:match [[:request :method "post"] + [:request :path "/store/order"] + [:request :body :id ?orderId]] + :generates [{:method "delete" + :path "/store/order/{ ?orderId }"}]}]} From f6993995af3de0eacc5c2dac6f5a631312a4f6ac Mon Sep 17 00:00:00 2001 From: Joost Diepenmaat Date: Tue, 28 Nov 2023 14:19:41 +0100 Subject: [PATCH 3/4] Review fixes - Cleanup root dir - Document builds a bit more --- Makefile | 3 +-- README.md | 21 ++++++++++++++------- current_arch.clj => dev/current_arch.clj | 0 validate => dev/validate | 0 validate.bat => dev/validate.bat | 0 5 files changed, 15 insertions(+), 9 deletions(-) rename current_arch.clj => dev/current_arch.clj (100%) rename validate => dev/validate (100%) rename validate.bat => dev/validate.bat (100%) diff --git a/Makefile b/Makefile index f7604f6..86a9a76 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ BABASHKA_VERSION:=1.3.186-SNAPSHOT exec_base_name=apie release_name=$(exec_base_name)-$(version) source_files=$(shell find src assets profiles -type f) -current_arch=$(shell bb current_arch.clj) +current_arch=$(shell bb dev/current_arch.clj) # uberjar is the babashka uberjar (not a java-compatible jar) uberjar=$(exec_base_name)-$(version)-standalone.jar @@ -73,5 +73,4 @@ $(exec_base_name).exe: $(release_name)-$(current_arch)/$(exec_base_name).exe # build for local use, non-windows $(exec_base_name): $(release_name)-$(current_arch)/$(exec_base_name) - echo $(current_arch) cp $< $@ diff --git a/README.md b/README.md index 6b758b7..7382b34 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Apie 🙈 OpenAPI Service Validator 🙈 +# Apie 🙈 OpenAPI Service Validator A command-line tool to spider and validate API endpoints to ensure compatibility with OpenAPI v3 specs. @@ -58,7 +58,7 @@ page](https://github.com/SURFnet/apie/releases). The released builds contain a standalone binary `apie`. -# Extending the validator +# Developing Apie ## Prerequisites for running/building from source @@ -70,10 +70,17 @@ runtime, or the full [Clojure installation](https://clojure.org/guides/install_clojure) which requires Java and is slower to start. -The `validator` script in the root of the repository will use Babashka -if `bb` is on the PATH, and `clojure` otherwise. +For running the validator without building, you can use the +`dev/validate` or `dev/validate.bat` script. -The Makefile can build a release for your current os: +The `dev/validate` script will use Babashka if `bb` is on the PATH, +and `clojure` otherwise. + +Alternatively, start a Clojure REPL and go from there. + +## Building Apie + +The Makefile can build a release for your current operating system: ``` make apie # on linux / macos @@ -82,10 +89,10 @@ make apie # on linux / macos or ``` -make apie.exe # on windows (untested) +make apie.exe # for windows (untested) ``` -We build for all supported platforms on Github; see +We build releases for all supported platforms on Github; see `.github/workflows/build.yaml` for details. # Reporting vulnerabilities diff --git a/current_arch.clj b/dev/current_arch.clj similarity index 100% rename from current_arch.clj rename to dev/current_arch.clj diff --git a/validate b/dev/validate similarity index 100% rename from validate rename to dev/validate diff --git a/validate.bat b/dev/validate.bat similarity index 100% rename from validate.bat rename to dev/validate.bat From 74b7cf2ffe0b495af0fe6a1675263025a2b94850 Mon Sep 17 00:00:00 2001 From: Joost Diepenmaat Date: Tue, 28 Nov 2023 14:45:57 +0100 Subject: [PATCH 4/4] Remove "included profiles" This is now part of the edhub-validator --- Makefile | 2 +- bb.edn | 2 +- deps.edn | 2 +- profiles/.keep | 0 src/nl/jomco/apie/included_profiles.clj | 9 ----- src/nl/jomco/apie/main.clj | 50 +++++++++++-------------- 6 files changed, 25 insertions(+), 40 deletions(-) delete mode 100644 profiles/.keep delete mode 100644 src/nl/jomco/apie/included_profiles.clj diff --git a/Makefile b/Makefile index 86a9a76..7a73829 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ BABASHKA_VERSION:=1.3.186-SNAPSHOT exec_base_name=apie release_name=$(exec_base_name)-$(version) -source_files=$(shell find src assets profiles -type f) +source_files=$(shell find src assets -type f) current_arch=$(shell bb dev/current_arch.clj) # uberjar is the babashka uberjar (not a java-compatible jar) diff --git a/bb.edn b/bb.edn index 3956770..ca0e0e5 100644 --- a/bb.edn +++ b/bb.edn @@ -1,3 +1,3 @@ -{:paths ["src" "assets" "profiles"] +{:paths ["src" "assets"] :deps {this/project {:local/root "."}}} diff --git a/deps.edn b/deps.edn index a55ca69..0f841d1 100644 --- a/deps.edn +++ b/deps.edn @@ -1,4 +1,4 @@ -{:paths ["src" "assets" "profiles"] +{:paths ["src" "assets"] :deps {org.clojure/tools.cli {:mvn/version "1.0.219"} ring/ring-codec {:mvn/version "1.2.0"} org.babashka/http-client {:mvn/version "0.4.15"} diff --git a/profiles/.keep b/profiles/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/src/nl/jomco/apie/included_profiles.clj b/src/nl/jomco/apie/included_profiles.clj deleted file mode 100644 index 7debb9e..0000000 --- a/src/nl/jomco/apie/included_profiles.clj +++ /dev/null @@ -1,9 +0,0 @@ -(ns nl.jomco.apie.included-profiles - "Include configuration for specific profiles in the jar/binary" - (:require [clojure.java.io :as io])) - -(def profiles - (some-> "included-profiles.txt" - (io/resource) - (io/reader :encoding "UTF-8") - (line-seq))) diff --git a/src/nl/jomco/apie/main.clj b/src/nl/jomco/apie/main.clj index 963da84..4e78196 100644 --- a/src/nl/jomco/apie/main.clj +++ b/src/nl/jomco/apie/main.clj @@ -5,7 +5,6 @@ [clojure.pprint :as pprint] [clojure.string :as string] [clojure.tools.cli :refer [parse-opts]] - [nl.jomco.apie.included-profiles :as included-profiles] [nl.jomco.apie.report :as report] [nl.jomco.apie.spider :as spider] [ring.util.codec :as codec])) @@ -30,13 +29,9 @@ ["-p" "--report REPORT-PATH" "Path to write report." :id :report-path :default "report.html"] - (if-let [[default] included-profiles/profiles] - ["-r" "--profile PROFILE" "Path to profile or name of builtin profile" - :id :profile - :default default] - ["-r" "--profile PROFILE" "Path to profile" - :id :profile - :missing "PROFILE is missing"]) + ["-r" "--profile PROFILE" "Path to profile" + :id :profile + :missing "PROFILE is missing"] ["-S" "--no-spider" "Disable spidering (re-use observations from OBSERVATIONS-PATH)." :id :no-spider? :default false] @@ -120,32 +115,31 @@ ;; str needed to coerce hiccup "rawstring" (str (report/report spec-data (read-edn observations-path) base-url))))) +(defn main + [{:keys [no-spider? no-report? profile] :as options}] + (let [profile* (file-or-resource profile) + parent-dir (file-parent profile*) + {:keys [openapi-spec] + :as profile-data} (read-edn profile*) + ;; if the profile configuration is indicated by a file path + ;; not in the current working directory, try to find the + ;; corresponding openapi spec in the same directory. + spec-data (if parent-dir + (read-json (io/file parent-dir openapi-spec)) + (read-json (file-or-resource openapi-spec)))] + (when-not no-spider? + (spider spec-data profile-data options)) + (when-not no-report? + (report spec-data options)))) + (defn -main [& args] - (let [{:keys [errors summary] - {:keys [no-spider? no-report? profile] :as options} :options} - (parse-opts args cli-options)] + (let [{:keys [errors summary options]} (parse-opts args cli-options)] (when (seq errors) (run! println errors) (println summary) - (when included-profiles/profiles - (println "\nBuiltin profiles:") - (run! #(println " - " %) included-profiles/profiles)) (System/exit 1)) - (let [profile* (file-or-resource profile) - parent-dir (file-parent profile*) - {:keys [openapi-spec] - :as profile-data} (read-edn profile*) - ;; if the profile configuration is indicated by a file path - ;; not in the current working directory, try to find the - ;; corresponding openapi spec in the same directory. - spec-data (if parent-dir - (read-json (io/file parent-dir openapi-spec)) - (read-json (file-or-resource openapi-spec)))] - (when-not no-spider? - (spider spec-data profile-data options)) - (when-not no-report? - (report spec-data options))))) + (main options))) (comment